From 568e1317d53fba7e6e9be91c872eac25f02c95c3 Mon Sep 17 00:00:00 2001 From: pvkyt5ngb Date: Mon, 6 Nov 2023 19:01:15 +0800 Subject: [PATCH] =?UTF-8?q?Add=20=E7=AC=AC=E5=9B=9B=E9=A2=98.c?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 第四题.c | 225 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 225 insertions(+) create mode 100644 第四题.c diff --git a/第四题.c b/第四题.c new file mode 100644 index 0000000..62379f2 --- /dev/null +++ b/第四题.c @@ -0,0 +1,225 @@ +#include +#include + +#define SIZE 9 + +void print_sudoku(char matrix[][SIZE]) { + for (int i = 0; i < SIZE; i++) { + for (int j = 0; j < SIZE; j++) { + printf("%c ", matrix[i][j]); + if (j == 2 || j == 5) { + printf("| "); + } + } + printf("\n"); + if (i == 2 || i == 5) { + printf("- - - + - - - + - - -\n"); + } + } +} + +bool is_valid_sudoku(char matrix[][SIZE]) { + // 检查每一行是否满足数独定义 + for (int i = 0; i < SIZE; i++) { + bool used[SIZE] = {false}; + for (int j = 0; j < SIZE; j++) { + char c = matrix[i][j]; + if (c != '.') { + int index = c - '1'; + if (used[index]) { + return false; + } + used[index] = true; + } + } + } + + // 检查每一列是否满足数独定义 + for (int j = 0; j < SIZE; j++) { + bool used[SIZE] = {false}; + for (int i = 0; i < SIZE; i++) { + char c = matrix[i][j]; + if (c != '.') { + int index = c - '1'; + if (used[index]) { + return false; + } + used[index] = true; + } + } + } + + // 检查每个3x3的小方格是否满足数独定义 + for (int block = 0; block < SIZE; block++) { + int row_start = (block / 3) * 3; + int col_start = (block % 3) * 3; + bool used[SIZE] = {false}; + for (int i = row_start; i < row_start + 3; i++) { + for (int j = col_start; j < col_start + 3; j++) { + char c = matrix[i][j]; + if (c != '.') { + int index = c - '1'; + if (used[index]) { + return false; + } + used[index] = true; + } + } + } + } + + return true; +} + +bool is_valid(char num, char matrix[][SIZE], int row, int col) { + // 检查同一行是否有重复数字 + for (int i = 0; i < SIZE; i++) { + if (matrix[row][i] == num) { + return false; + } + } + + // 检查同一列是否有重复数字 + for (int i = 0; i < SIZE; i++) { + if (matrix[i][col] == num) { + return false; + } + } + + // 检查所在的3x3小方格是否有重复数字 + int row_start = (row / 3) * 3; + int col_start = (col / 3) * 3; + for (int i = row_start; i < row_start + 3; i++) { + for (int j = col_start; j < col_start + 3; j++) { + if (matrix[i][j] == num) { + return false; + } + } + } + + return true; +} + +bool backtrack(char matrix[][SIZE]) { + for (int i = 0; i < SIZE; i++) { + for (int j = 0; j < SIZE; j++) { + if (matrix[i][j] == '.') { + for (char num = '1'; num <= '9'; num++) { + if (is_valid(num, matrix, i, j)) { + matrix[i][j] = num; + if (backtrack(matrix)) { + return true; + } + matrix[i][j] = '.'; // 回溯 + } + } + return false; + } + } + } + return true; +} + +bool solve_sudoku(char matrix[][SIZE]) { + if (is_valid_sudoku(matrix)) { + if (backtrack(matrix)) { + return true; + } else { + return false; + } + } else { + return false; + } +} + +int main() { + char board0[SIZE][SIZE] = { + {'5', '3', '.', '.', '7', '.', '.', '.', '.'}, + {'6', '.', '.', '1', '9', '5', '.', '.', '.'}, + {'.', '9', '8', '.', '.', '.', '.', '6', '.'}, + {'8', '.', '.', '.', '6', '.', '.', '.', '3'}, + {'4', '.', '.', '8', '.', '3', '.', '.', '1'}, + {'7', '.', '.', '.', '2', '.', '.', '.', '6'}, + {'.', '6', '.', '.', '.', '.', '2', '8', '.'}, + {'.', '.', '.', '4', '1', '9', '.', '.', '5'}, + {'.', '.', '.', '.', '8', '.', '.', '7', '9'} + }; + + char board1[SIZE][SIZE] = { + {'8', '3', '.', '.', '7', '.', '.', '.', '.'}, + {'6', '.', '.', '1', '9', '5', '.', '.', '.'}, + {'.', '9', '8', '.', '.', '.', '.', '6', '.'}, + {'8', '.', '.', '.', '6', '.', '.', '.', '3'}, + {'4', '.', '.', '8', '.', '3', '.', '.', '1'}, + {'7', '.', '.', '.', '2', '.', '.', '.', '6'}, + {'.', '6', '.', '.', '.', '.', '2', '8', '.'}, + {'.', '.', '.', '4', '1', '9', '.', '.', '5'}, + {'.', '.', '.', '.', '8', '.', '.', '7', '9'} + }; + + char board2[SIZE][SIZE] = { + {'5', '2', '.', '.', '7', '.', '.', '.', '.'}, + {'6', '.', '.', '1', '9', '5', '.', '.', '.'}, + {'.', '9', '8', '.', '.', '.', '.', '6', '.'}, + {'8', '.', '.', '.', '6', '.', '.', '.', '3'}, + {'4', '.', '.', '8', '.', '3', '.', '.', '1'}, + {'7', '.', '.', '.', '2', '.', '.', '.', '6'}, + {'.', '6', '.', '.', '.', '.', '2', '8', '.'}, + {'.', '.', '.', '4', '1', '9', '.', '.', '5'}, + {'.', '.', '.', '.', '8', '.', '.', '7', '9'} + }; + + printf("The original Sudoku matrix:\n"); + print_sudoku(board0); + + if (is_valid_sudoku(board0)) { + printf("True: Valid initial Sudoku matrix!\n"); + if (solve_sudoku(board0)) { + printf("The solution of Sudoku matrix:\n"); + print_sudoku(board0); + } else { + printf("No solution!\n"); + } + } else { + printf("False: Invalid initial Sudoku matrix!\n"); + printf("No solution!\n"); + } + + printf("\n"); + + printf("The original Sudoku matrix:\n"); + print_sudoku(board1); + + if (is_valid_sudoku(board1)) { + printf("True: Valid initial Sudoku matrix!\n"); + if (solve_sudoku(board1)) { + printf("The solution of Sudoku matrix:\n"); + print_sudoku(board1); + } else { + printf("No solution!\n"); + } + } else { + printf("False: Invalid initial Sudoku matrix!\n"); + printf("No solution!\n"); + } + + printf("\n"); + + printf("The original Sudoku matrix:\n"); + print_sudoku(board2); + + if (is_valid_sudoku(board2)) { + printf("True: Valid initial Sudoku matrix!\n"); + if (solve_sudoku(board2)) { + printf("The solution of Sudoku matrix:\n"); + print_sudoku(board2); + } else { + printf("No solution!\n"); + } + } else { + printf("False: Invalid initial Sudoku matrix!\n"); + printf("No solution!\n"); + } + + return 0; +} \ No newline at end of file