Chatgpt 真的可以写出完美的代码,学计算机编程没有前途。还有2天就要高考了,大家加油考出好成绩。但不要报编程专业了。
下面是一个完整的9x9数独求解程序,使用C语言实现。这个程序包括读取数独棋盘、解决数独问题并打印解决方案的功能。数独解法使用回溯算法。
#include <stdio.h>
#include <stdbool.h>#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-9for (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("\n");}
}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\n");}return 0;
}
代码说明
- isRowSafe:检查指定行是否安全放置数字。
- isColSafe:检查指定列是否安全放置数字。
- isBoxSafe:检查3x3子网格是否安全放置数字。
- isSafe:综合检查行、列和子网格,判断是否安全放置数字。
- findUnassignedLocation:寻找未分配的位置。
- solveSudoku:回溯算法解决数独问题。
- printGrid:打印数独棋盘。
- main:定义数独问题并调用求解和打印函数。
这个程序可以解决9x9的数独问题,并打印出解决方案。可以修改grid
数组中的初始值来测试不同的数独问题。