diff --git a/shudo.c b/shudo.c new file mode 100644 index 0000000..7c45598 --- /dev/null +++ b/shudo.c @@ -0,0 +1,238 @@ +#include +#include +#include +#include + + +void boradprint(int** board) { + printf("|-----------------------|\n"); + for (int row = 0; row < 9; row++) { + if (row == 3 || row == 6) { + printf("|-----------------------|\n"); + } + printf("| "); + for (int col = 0; col < 9; col++) { + if (board[row][col] == 0) { + printf(". "); + } + else { + printf("%d ", board[row][col]); + } + if (col == 2 || col == 5) { + printf("| "); + } + } + printf("|\n"); + } + printf("|-----------------------|\n"); +} + +void freeBoard(int** board, int rows) { + for (int i = 0; i < rows; i++) { + free(board[i]); // 释放每一行的内存 + } + free(board); // 释放指向行的指针数组的内存 +} + +bool isVaild(int** borad) +{ + printf("The original Sudoku matrix: \n"); + boradprint(borad); + int row_count = 0; + int col_count = 0; + int col_true[10] = { 0 }; + int row_true[10] = { 0 }; + while (row_count!=9) + { + for (int i = 0; i < 9; i++)//every raw + { + if (borad[row_count][i] > 0) //if it has define + { + if (!col_true[borad[row_count][i]])//check + { + col_true[borad[row_count][i]] = 1; + } + else + { + printf("False:Invalid initial Sudoku matrix!\n"); + printf("The number %d in the col %d has been used!\n", borad[row_count][i], row_count+1 ); + return false; + } + } + } + row_count++; + for (int i = 0; i <= 9; i++)col_true[i] = 0; + } + while (col_count!=9) + { + for (int i = 0; i < 9; i++)//every col + { + if (borad[i][col_count]) //if it has define + { + if (!row_true[borad[i][col_count]])//check + { + row_true[borad[i][col_count]] = 1; + } + else + { + printf("False:Invalid initial Sudoku matrix!\n"); + printf("The number %d in the col %d has been used!\n", borad[i][col_count], col_count+1); + return false; + } + } + } + col_count++; + for (int i = 0; i < 10; i++)row_true[i] = 0; + } + row_count = col_count = 0; + int block_count = 1; + int block_group[10]={0}; + int block_row = (row_count/3)*3; + int block_col = (col_count/3)*3; + while (block_count != 9) + { + for (int i = block_row; i < block_row + 3; i++) + for (int j = block_col; j < block_col + 3; j++) + if (borad[i][j]) + if (!block_group[borad[i][j]])block_group[borad[i][j]] = 1; + else + { + printf("False:Invalid initial Sudoku matrix!\n"); + printf("The number %d in the block %d has been used!\n", borad[i][j], block_count); + return false; + } + block_count++; + for (int i = 0; i < 10; i++) + { + block_group[i] = 0; + } + switch (block_count) + { + case 2:block_row = 0; block_col = 3; break; + case 3:block_row = 0; block_col = 6; break; + case 4:block_row = 3; block_col = 0; break; + case 5:block_row = 3; block_col = 3; break; + case 6:block_row = 3; block_col = 6; break; + case 7:block_row = 6; block_col = 0; break; + case 8:block_row = 6; block_col = 3; break; + case 9:block_row = 6; block_col = 6; break; + default:return false; + } + } + printf("True:Valid initial Sudoku matrix!\n"); + return true; +} + +int** boradgenerate() { + int count_col = 0; + int count_row = 0; + int col[3] = { 0 }; + int num_true[9] = { 0 }; + int col_true[9] = { 0 }; + int** borad; + borad = (int**)malloc(9 * sizeof(int*)); + for (int i = 0; i < 9; i++) + borad[i] = (int*)malloc(9 * sizeof(int)); + for (int i = 0; i < 9; i++) + for (int j = 0; j < 9; j++) + borad[i][j] = 0; + for (count_row = 0; count_row <= 8; count_row++) { + if (count_row % 3 == 0) + for (int i = 0; i < 9; i++) + num_true[i] = 0; + while (count_col != 3) + { + int num = rand() % 9; + if (!col_true[num]) { + col[count_col++] = num; + col_true[num] = 1; + } + } + count_col = 0; + for (int i = 0; i < 9; i++) + col_true[i] = 0; + while (count_col != 3) + { + int num = rand() % 9; + if (!num_true[num]) { + borad[count_row][col[count_col++]] = num + 1; + num_true[num] = 1; + } + } + count_col = 0; + } + return borad; +} + +int** change(int board[][9]) { + int** doublePointer = (int**)malloc(9 * sizeof(int*)); + for (int i = 0; i < 9; i++) { + doublePointer[i] = (int*)malloc(9 * sizeof(int)); + for (int j = 0; j < 9; j++) { + doublePointer[i][j] = board[i][j]; + } + } + return doublePointer; +} + +bool solveborad(int** borad) +{ + printf("The original Sudoku matrix: \n"); + isVaild(borad); + int** temp_borad=borad; + for (int i = 0 ; i < 9; i++) + { + for (int j = 0; j < 9; j++) + { + if (!borad[i][j]) { + int temp = borad[i][j]; + for (int k = 1; k < 10; k++) + { + temp_borad[i][j] = k; + if (isVaild(temp_borad)) + { + borad[i][j] = k; + if (solveborad(borad)) + { + printf("True:Valid initial Sudoku matrix!\n"); + boradprint(borad); + return true; + } + else + { + borad[i][j] = temp; + } + } + else + { + temp_borad[i][j] =temp; + } + } + printf("No solution"); + return false; + } + } + + } + + return true; + printf("True:Valid initial Sudoku matrix!"); +} + +int main() { + srand(time(NULL)); + int board1[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} }; + + int** board2=change(board1); + + solveborad(board2); + return 0; +}