diff --git a/forth.c b/forth.c new file mode 100644 index 0000000..09e6cbc --- /dev/null +++ b/forth.c @@ -0,0 +1,128 @@ +#include +#include + +#define SIZE 9 + +void printSudoku(int board[SIZE][SIZE]) { + for (int i = 0; i < SIZE; i++) { + for (int j = 0; j < SIZE; j++) { + if (j % 3 == 0 && j != 0) { + printf("| "); + } + printf("%d ", board[i][j] == 0 ? '.' : board[i][j]); + } + printf("\n"); + if ((i + 1) % 3 == 0 && i != 8) { + printf("---------------------\n"); + } + } +} + +bool isValidPlacement(int board[SIZE][SIZE], int row_check[SIZE][SIZE], int col_check[SIZE][SIZE], + int block_check[SIZE][SIZE], int num, int row, int col) { + int blockIndex = (row / 3) * 3 + (col / 3); + if (row_check[row][num - 1] || col_check[col][num - 1] || block_check[blockIndex][num - 1]) { + return false; // 数字已在行、列或3x3块中存在 + } + return true; +} + +void setPlacement(int row_check[SIZE][SIZE], int col_check[SIZE][SIZE], + int block_check[SIZE][SIZE], int num, int row, int col, bool placed) { + int blockIndex = (row / 3) * 3 + (col / 3); + row_check[row][num - 1] = placed; + col_check[col][num - 1] = placed; + block_check[blockIndex][num - 1] = placed; +} + +bool isValidSudoku(int board[SIZE][SIZE]) { + int row_check[SIZE][SIZE] = { 0 }; + int col_check[SIZE][SIZE] = { 0 }; + int block_check[SIZE][SIZE] = { 0 }; + + for (int i = 0; i < SIZE; i++) { + for (int j = 0; j < SIZE; j++) { + int num = board[i][j]; + if (num != 0) { + if (!isValidPlacement(board, row_check, col_check, block_check, num, i, j)) { + printf("False: Invalid initial Sudoku matrix!\n"); + printf("The number %d has conflicts!\n", num); + return false; + } + setPlacement(row_check, col_check, block_check, num, i, j, true); + } + } + } + return true; +} + +bool solveSudoku(int board[SIZE][SIZE]) { + for (int i = 0; i < SIZE; i++) { + for (int j = 0; j < SIZE; j++) { + if (board[i][j] == 0) { // 找到一个空的位置 + for (int num = 1; num <= 9; num++) { + board[i][j] = num; // 填入数字 + + if (isValidSudoku(board)) { + if (solveSudoku(board)) { + return true; // 若成功,则返回 + } + } + board[i][j] = 0; // 撤销填入,重试下一个数字 + } + return false; // 若所有数字尝试均不行,则返回不成功 + } + } + } + return true; // 全部填满,返回成功 +} + +int main() { + int board0[SIZE][SIZE] = { + {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} + }; + + int board1[SIZE][SIZE] = { + {8, 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} + }; + + for (int boardIndex = 0; boardIndex < 2; boardIndex++) { + int (*currentBoard)[SIZE] = boardIndex == 0 ? board0 : board1; + + printf("The original Sudoku matrix:\n"); + printSudoku(currentBoard); + if (isValidSudoku(currentBoard)) { + printf("True: Valid initial Sudoku matrix!\n"); + if (solveSudoku(currentBoard)) { + printf("The solution of Sudoku matrix:\n"); + printSudoku(currentBoard); + } + else { + printf("No solution!\n"); + } + } + else { + printf("False: Invalid initial Sudoku matrix!\n"); + printf("No solution!\n"); + } + printf("\n"); + } + + return 0; +}