chargpt: 用纯c 写一9*9数独程序
Chatgpt 真的可以写出完美的代码,学计算机编程没有前途。还有2天就要高考了,大家加油考出好成绩。但不要报编程专业了。
下面是一个完整的9×9数独求解程序,使用C语言实现。这个程序包括读取数独棋盘、解决数独问题并打印解决方案的功能。数独解法使用回溯算法。
#include
#include
#define N 9
// 检查在给定行是否可以放置数字num
bool isRowSafe(int grid[N][N], int row, int num) {
for (int col = 0; col < N; col++) {
if (grid[row][col] == num) {
return false;
}
}
return true;
}
// 检查在给定列是否可以放置数字num
bool isColSafe(int grid[N][N], int col, int num) {
for (int row = 0; row < N; row++) {
if (grid[row][col] == num) {
return false;
}
}
return true;
}
// 检查在给定3x3子网格是否可以放置数字num
bool isBoxSafe(int grid[N][N], int boxStartRow, int boxStartCol, int num) {
for (int row = 0; row < 3; row++) {
for (int col = 0; col < 3; col++) {
if (grid[row + boxStartRow][col + boxStartCol] == num) {
return false;
}
}
}
return true;
}
// 检查在给定位置是否可以放置数字num
bool isSafe(int grid[N][N], int row, int col, int num) {
return isRowSafe(grid, row, num) &&
isColSafe(grid, col, num) &&
isBoxSafe(grid, row - row % 3, col - col % 3, num);
}
// 寻找未分配的位置
bool findUnassignedLocation(int grid[N][N], int *row, int *col) {
for (*row = 0; *row < N; (*row)++) {
for (*col = 0; *col < N; (*col)++) {
if (grid[*row][*col] == 0) {
return true;
}
}
}
return false;
}
// 数独求解函数
bool solveSudoku(int grid[N][N]) {
int row, col;
// 如果没有未分配的位置,说明解已找到
if (!findUnassignedLocation(grid, &row, &col)) {
return true;
}
// 尝试放置数字1-9
for (int num = 1; num <= 9; num++) {
if (isSafe(grid, row, col, num)) {
grid[row][col] = num;
if (solveSudoku(grid)) {
return true;
}
// 如果放置num不成功,撤销赋值
grid[row][col] = 0;
}
}
// 触发回溯
return false;
}
// 打印数独棋盘
void printGrid(int grid[N][N]) {
for (int row = 0; row < N; row++) {
for (int col = 0; col < N; col++) {
printf("%2d", grid[row][col]);
}
printf("
");
}
}
int main() {
// 示例数独问题 (0 表示空格)
int grid[N][N] = {
{5, 3, 0, 0, 7, 0, 0, 0, 0},
{6, 0, 0, 1, 9, 5, 0, 0, 0},
{0, 9, 8, 0, 0, 0, 0, 6, 0},
{8, 0, 0, 0, 6, 0, 0, 0, 3},
{4, 0, 0, 8, 0, 3, 0, 0, 1},
{7, 0, 0, 0, 2, 0, 0, 0, 6},
{0, 6, 0, 0, 0, 0, 2, 8, 0},
{0, 0, 0, 4, 1, 9, 0, 0, 5},
{0, 0, 0, 0, 8, 0, 0, 7, 9}
};
if (solveSudoku(grid)) {
printGrid(grid);
} else {
printf("No solution exists
");
}
return 0;
}
代码说明
- isRowSafe:检查指定行是否安全放置数字。
- isColSafe:检查指定列是否安全放置数字。
- isBoxSafe:检查3×3子网格是否安全放置数字。
- isSafe:综合检查行、列和子网格,判断是否安全放置数字。
- findUnassignedLocation:寻找未分配的位置。
- solveSudoku:回溯算法解决数独问题。
- printGrid:打印数独棋盘。
- main:定义数独问题并调用求解和打印函数。
这个程序可以解决9×9的数独问题,并打印出解决方案。可以修改grid
数组中的初始值来测试不同的数独问题。