Add 1.4(yi)

main
phbqmr4vg 2 years ago
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…
Cancel
Save