From 0734407cfaabbf7bab92d0320b80b3579f26199c Mon Sep 17 00:00:00 2001 From: p5fohke9s <837368911@qq.com> Date: Thu, 7 Nov 2024 23:15:00 +0800 Subject: [PATCH] ADD file via upload --- f4.c | 212 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 212 insertions(+) create mode 100644 f4.c diff --git a/f4.c b/f4.c new file mode 100644 index 0000000..a5ddf83 --- /dev/null +++ b/f4.c @@ -0,0 +1,212 @@ +#include + + +int checkRows(int matrix[9][9]) { + for (int i = 0; i < 9; i++) { + int count[10] = {0}; + for (int j = 0; j < 9; j++) { + if (matrix[i][j] >= 1 && matrix[i][j] <= 9) { + if (count[matrix[i][j]] == 1) { + return 0; + } + count[matrix[i][j]]++; + } + } + } + return 1; +} + + +int checkColumns(int matrix[9][9]) { + for (int j = 0; j < 9; j++) { + int count[10] = {0}; + for (int i = 0; i < 9; i++) { + if (matrix[i][j] >= 1 && matrix[i][j] <= 9) { + if (count[matrix[i][j]] == 1) { + return 0; + } + count[matrix[i][j]]++; + } + } + } + return 1; +} + + +int checkSubMatrices(int matrix[9][9]) { + for (int blockRow = 0; blockRow < 3; blockRow++) { + for (int blockCol = 0; blockCol < 3; blockCol++) { + int count[10] = {0}; + for (int i = blockRow * 3; i < blockRow * 3 + 3; i++) { + for (int j = blockCol * 3; j < blockCol * 3 + 3; j++) { + if (matrix[i][j] >= 1 && matrix[i][j] <= 9) { + if (count[matrix[i][j]] == 1) { + return 0; + } + count[matrix[i][j]]++; + } + } + } + } + } + return 1; +} + + +void printMatrix(int matrix[9][9]) { + printf("|--------------------|\n|"); + for (int i = 0; i < 9; i++) { + for (int j = 0; j < 9; j++) { + printf("%d ", matrix[i][j]); + if((i+1)%1==0&&(j+1)%3==0) printf("|"); + if((i+1)%3==0&&(j+1)%9==0) printf("\n|--------------------|"); + if((j+1)==9&&i!=8) printf("\n|"); + } + + } +} + + +int findUnassignedLocation(int matrix[9][9], int *row, int *col) { + for (*row = 0; *row < 9; (*row)++) { + for (*col = 0; *col < 9; (*col)++) { + if (matrix[*row][*col] == 0) { + return 1; + } + } + } + return 0; +} + + +int isSafe(int matrix[9][9], int row, int col, int num) { + + for (int i = 0; i < 9; i++) { + if (matrix[row][i] == num) { + return 0; + } + } + + + for (int i = 0; i < 9; i++) { + if (matrix[i][col] == num) { + return 0; + } + } + + + 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 (matrix[i][j] == num) { + return 0; + } + } + } + + return 1; +} + + +int solveSudoku(int matrix[9][9]) { + int row, col; + if (!findUnassignedLocation(matrix, &row, &col)) { + return 1; + } + + for (int num = 1; num <= 9; num++) { + if (isSafe(matrix, row, col, num)) { + matrix[row][col] = num; + if (solveSudoku(matrix)) { + return 1; + } + matrix[row][col] = 0; + } + } + + return 0; +} + +int main() { + int matrix[9][9] = { + {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"); + printMatrix(matrix); + + + if (checkRows(matrix) && checkColumns(matrix) && checkSubMatrices(matrix)) { + printf("True:Valid initial Sudoku matrix!\n"); + + + if (solveSudoku(matrix)) { + printf("The solution of Sudoku matrix:\n"); + printMatrix(matrix); + } else { + printf("No solution!\n"); + } + } else { + printf("False:Invalid initial Sudoku matrix!\n"); + + + for (int i = 0; i < 9; i++) { + int count[10] = {0}; + for (int j = 0; j < 9; j++) { + if (matrix[i][j] >= 1 && matrix[i][j] <= 9) { + if (count[matrix[i][j]] == 1) { + printf("The number %d in the row %d has been used!\n", matrix[i][j], i + 1); + break; + } + count[matrix[i][j]]++; + } + } + } + + + for (int j = 0; j < 9; j++) { + int count[10] = {0}; + for (int i = 0; i < 9; i++) { + if (matrix[i][j] >= 1 && matrix[i][j] <= 9) { + if (count[matrix[i][j]] == 1) { + printf("The number %d in the col %d has been used!\n", matrix[i][j], j + 1); + break; + } + count[matrix[i][j]]++; + } + } + } + + + for (int blockRow = 0; blockRow < 3; blockRow++) { + for (int blockCol = 0; blockCol < 3; blockCol++) { + int count[10] = {0}; + for (int i = blockRow * 3; i < blockRow * 3 + 3; i++) { + for (int j = blockCol * 3; j < blockCol * 3 + 3; j++) { + if (matrix[i][j] >= 1 && matrix[i][j] <= 9) { + if (count[matrix[i][j]] == 1) { + printf("The number %d in the block %d has been used!\n", matrix[i][j], blockRow * 3 + blockCol + 1); + break; + } + count[matrix[i][j]]++; + } + } + } + } + } + + printf("No solution!\n"); + } + + return 0; +}