parent
9e375f6ae2
commit
463b258e93
@ -0,0 +1,124 @@
|
||||
#include <stdio.h>
|
||||
#include <stdbool.h>
|
||||
|
||||
bool isValid(int row,int col,int num);
|
||||
bool solveSudoku();
|
||||
void Print();
|
||||
void Judge();
|
||||
int board[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}
|
||||
};
|
||||
int flag=1;
|
||||
|
||||
int main(){
|
||||
printf("The original Sudoku matrix: \n");
|
||||
Print();
|
||||
Judge();
|
||||
if(solveSudoku()){
|
||||
printf("The solution of Sudoku matrix:\n");
|
||||
Print();
|
||||
}
|
||||
else printf("No solution!\n");
|
||||
return 0;
|
||||
}
|
||||
|
||||
void Judge(){
|
||||
for(int i=0;i<9;i++){
|
||||
for(int j=0;j<9;j++){
|
||||
if(board[i][j]){
|
||||
int x=i+1,y=j+1;
|
||||
for(y;y<9;y++){
|
||||
if(board[i][j]==board[i][y]){
|
||||
printf("False:Invalid initial Sudoku matrix!\n");
|
||||
printf("The number %d in the col %d has been used!\n",board[i][j],y+1);
|
||||
return;
|
||||
}
|
||||
}
|
||||
for(x;x<9;x++){
|
||||
if(board[i][j]==board[x][j]){
|
||||
printf("False:Invalid initial Sudoku matrix!\n");
|
||||
printf("The number %d in the row %d has been used!\n",board[i][j],x+1);
|
||||
return;
|
||||
}
|
||||
}
|
||||
int a=i/3*3,b=j/3*3;
|
||||
int m=a*3+b/3+1;
|
||||
for(int k=0;k<=2;k++){
|
||||
for(int l=0;l<=2;l++){
|
||||
if(board[a][b]==board[i][j]&&a!=i&&b!=j){
|
||||
printf("False:Invalid initial Sudoku matrix!\n");
|
||||
printf("The number %d in the block %d has been used!\n",board[i][j],m);
|
||||
return;
|
||||
}
|
||||
b++;
|
||||
}
|
||||
a++;
|
||||
b=j/3*3;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
printf("True:Valid initial Sudoku matrix!\n");
|
||||
}
|
||||
|
||||
bool isValid(int row,int col,int num){
|
||||
for(int i=0;i<9;i++){ // 判断行中是否有重复数字
|
||||
if(board[row][i]==num){
|
||||
return false;
|
||||
}
|
||||
}
|
||||
for(int i=0;i<9;i++){ // 判断列中是否有重复数字
|
||||
if (board[i][col]==num){
|
||||
return false;
|
||||
}
|
||||
}
|
||||
int startRow=row/3*3; // 判断3x3子矩阵中是否有重复数字
|
||||
int startCol=col/3*3;
|
||||
for(int i=startRow;i<startRow+3;i++){
|
||||
for(int j=startCol;j<startCol+3;j++){
|
||||
if(board[i][j]==num){
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
bool solveSudoku(){
|
||||
for(int row=0;row<9;row++){
|
||||
for(int col=0;col<9;col++){
|
||||
if(board[row][col] == 0){
|
||||
for(int num=1;num<=9;num++){
|
||||
if(isValid(row,col,num)){
|
||||
board[row][col]=num;
|
||||
if(solveSudoku())return true;
|
||||
board[row][col] = 0;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
void Print(){
|
||||
printf("|-----------------------|\n");
|
||||
for(int i=0;i<9;i++){
|
||||
printf("| ");
|
||||
for(int j=0;j<9;j++){
|
||||
printf("%d ",board[i][j]);
|
||||
if((j+1)%3==0)printf("| ");
|
||||
}
|
||||
printf("\n");
|
||||
if((i+1)%3==0)printf("|-----------------------|\n");
|
||||
}
|
||||
}
|
||||
Loading…
Reference in new issue