#include #include #include int checkMatrix(int matrixArr[9][9], int isPrintInfo){ int rowCnt[9][10]={0}; int colCnt[9][10]={0}; int bloCnt[9][10]={0}; for(int i=0;i<9;i++){ for(int j=0;j<9;j++){ if(matrixArr[i][j]!=0){ rowCnt[i][matrixArr[i][j]]++; if(rowCnt[i][matrixArr[i][j]]>1){ if(isPrintInfo){ printf("\nFalse:Invalid initial Sudoku matrix!"); printf("\nThe number %d in the row %d has been used!",matrixArr[i][j],i+1); } return 0; } colCnt[j][matrixArr[i][j]]++; if(colCnt[j][matrixArr[i][j]]>1){ if(isPrintInfo){ printf("\nFalse:Invalid initial Sudoku matrix!"); printf("\nThe number %d in the col %d has been used!",matrixArr[i][j],j+1); } return 0; } bloCnt[i/3*3+j/3][matrixArr[i][j]]++; if(bloCnt[i/3*3+j/3][matrixArr[i][j]]>1){ if(isPrintInfo){ printf("\nFalse:Invalid initial Sudoku matrix!"); printf("\nThe number %d in the block %d has been used!",matrixArr[i][j],i/3*3+j/3+1); } return 0; } } } } if(isPrintInfo){ printf("\nTrue:Valid initial Sudoku matrix!"); } return 1; } void matrixOutput(int matrixArr[9][9]) { for (int i = 0; i < 9; i++) { for (int j = 0; j < 9; j++) { printf("%d", matrixArr[i][j]); if (j != 8) printf(" "); } if (i != 8) printf("\n"); } } int fillMatrix(int matrixArr[9][9], int row, int col){ if(row==9){ return 1; } if(col==9){ return fillMatrix(matrixArr,row+1,0); } if(matrixArr[row][col]!=0){ return fillMatrix(matrixArr, row, col+1); } for(int i=1;i<=9;i++){ matrixArr[row][col]=i; if(checkMatrix(matrixArr,0)){ if(fillMatrix(matrixArr,row,col+1)){ return 1; } matrixArr[row][col]=0; }else{ matrixArr[row][col]=0; } } return 0; } int main() { int board0[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 board1[9][9] = {{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}}; int board2[9][9] = {{5, 2, 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"); matrixOutput(board0); if (checkMatrix(board0, 1)) { if (fillMatrix(board0, 0, 0)) { printf("\nThe solution of Sudoku matrix:\n"); matrixOutput(board0); } else { printf("\nNo solution!"); } } else { printf("\nNo solution!"); } return 0; }