diff --git a/buchong.c b/buchong.c new file mode 100644 index 0000000..b05f20b --- /dev/null +++ b/buchong.c @@ -0,0 +1,106 @@ +#include + +#define N 9 + +// 函数用于打印数独矩阵 +void printSudoku(int sudoku[N][N]) { + for (int i = 0; i < N; i++) { + for (int j = 0; j < N; j++) { + printf("%d ", sudoku[i][j]); + } + printf("\n"); + } +} + +// 函数用于检查在特定位置填入数字是否有效 +int isValid(int sudoku[N][N], int row, int col, int num) { + // 检查行和列 + for (int i = 0; i < N; i++) { + if (sudoku[row][i] == num || sudoku[i][col] == num) { + return 0; + } + } + + // 检查3x3子矩阵 + int startRow = row - row % 3; + int startCol = col - col % 3; + for (int i = startRow; i < startRow + 3; i++) { + for (int j = startCol; j < startCol + 3; j++) { + if (sudoku[i][j] == num) { + return 0; + } + } + } + + return 1; +} + +// 递归函数用于解决数独问题 +int solveSudoku(int sudoku[N][N]) { + int row, col; + + // 检查是否有未填数字的位置 + int isFilled = 1; + for (row = 0; row < N; row++) { + for (col = 0; col < N; col++) { + if (sudoku[row][col] == 0) { + isFilled = 0; + break; + } + } + if (!isFilled) { + break; + } + } + + // 如果所有位置都已填满,数独解决 + if (isFilled) { + return 1; + } + + // 尝试填入数字 + for (int num = 1; num <= 9; num++) { + if (isValid(sudoku, row, col, num)) { + sudoku[row][col] = num; + + // 递归解决下一个位置 + if (solveSudoku(sudoku)) { + return 1; + } + + // 如果无法找到有效解,撤销当前的填入 + sudoku[row][col] = 0; + } + } + + return 0; +} + +int main() { + int sudoku[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} + }; + + printf("The original Sudoku matrix:\n"); + printSudoku(sudoku); + + if (solveSudoku(sudoku)) { + printf("True: Valid initial Sudoku matrix!\n"); + printf("The solution of Sudoku matrix:\n"); + printSudoku(sudoku); + } + else { + printf("False: Invalid initial Sudoku matrix!\n"); + printf("No solution!\n"); + } + + return 0; +}