diff --git a/矩阵4.c b/矩阵4.c new file mode 100644 index 0000000..24689ff --- /dev/null +++ b/矩阵4.c @@ -0,0 +1,369 @@ +#include +#include +#include +#include +#include +void b(int board[][9]) +{ + printf("|-----------------------|\n"); +for(int i=0;i<=8;i++) +{ + printf("| "); + for(int j=0;j<=8;j++) + { + printf("%d ",board[i][j]); + if(j==2||j==5) + printf("| "); + } + printf("|\n"); + if(i==2||i==5) + printf("|-----------------------|\n"); +} +printf("|-----------------------|\n"); +} +void bb(int board[][9]) +{ + srand(time(NULL)); + int board[9][9]={0}; + for(int i=1;i<=9;i++) + { + int x,y; + while(1) + { + + x=rand()%10; + y=rand()%10; + + if((x>=0&&x<=2)&&(y>=0&&y<=8)) + { + int a=0; + for(int j=0;j<=8;j++) + { + if(board[x][j]!=0) + a++; + } + if(a<3&&board[x][y]==0) + { + board[x][y]=i; + break; + } + } + } + } + for(int i=1;i<=9;i++) + { + int x,y; + while(1) + { + + x=rand()%10; + y=rand()%10; + + + if((x>=3&&x<=5)&&(y>=0&&y<=8)) + { + int a=0; + for(int j=0;j<=8;j++) + { + if(board[x][j]!=0) + a++; + } + if(a<3&&board[x][y]==0) + { + board[x][y]=i; + break; + } + } + } +} +for(int i=1;i<=9;i++) + { + int x,y; + while(1) + { + + x=rand()%10; + y=rand()%10; + if((x>=6&&x<=8)&&(y>=0&&y<=8)) + { + int a=0; + for(int j=0;j<=8;j++) + { + if(board[x][j]!=0) + a++; + } + if(a<3&&board[x][y]==0) + { + board[x][y]=i; + break; + } + } + } +} + b(board); + +} +int w(int board[][9]) +{ + int judge=0; + flag1: + if(judge==0) + { + for(int i=0;i<9;i++) + { + for(int j=0;j<9;j++) + { + if(board[i][j]!=0) + { + for(int m=0;m<9;m++) + { + if(board[i][m]==board[i][j]&&m!=j) + { + judge=1; + goto flag1; + } + } + } + } + } + } + flag2: + if(judge==0) + { + for(int i=0;i<9;i++) + { + for(int j=0;j<9;j++) + { + if(board[j][i]!=0) + { + for(int m=0;m<9;m++) + { + if(board[m][i]==board[j][i]&&m!=j) + { + judge=1; + goto flag2; + } + } + } + } + } + } + flag3: + if(judge==0) + { + for(int i=0;i<=6;i=i+3) + { + for(int j=0;j<=6;j=j+3) + { + for(int x=i;x1) + { + d=1; + printf("False:Invalid initial Sudoku matrix!"); + printf("The number %d in the col %d has been used!",k,i+1); + break; + } + } + if(d==1) + break; + } + + if(d==1) + break; + } +if(d==1) +{ + u=0; + goto flag; +} + for(int i=0;i<=8;i++) + { + int c[9]={0}; + for(int j=0;j<=8;j++) + { + for(int k=1;k<=9;k++) + { + if(board1[j][i]==k) + c[k-1]++; + if(c[k-1]>1) + { + e=1; + printf("False:Invalid initial Sudoku matrix!"); + printf("The number %d in the row %d has been used!",k,i+1); + break; + } + } + if(e==1) + break; + } + if(e==1) + break; + } + if(e==1) + { + u=0; + goto flag; + } + for(int i=0;i<=6;i=i+3) + { + for(int j=0;j<=6;j=j+3) + { + int r; + if(i==0&&j==0) + r=1; + if(i==0&&j==3) + r=2; + if(i==0&&j==6) + r=3; + if(i==3&&j==0) + r=4; + if(i==3&&j==3) + r=5; + if(i==3&&j==6) + r=6; + if(i==6&&j==0) + r=7; + if(i==6&&j==3) + r=8; + if(i==6&&j==6) + r=9; + int c[9]={0}; + for(int g=i;g<=i+2;g++) + { + + for(int h=j;h<=j+2;h++) + { + for(int k=1;k<=9;k++) + { + if(board1[g][h]==k) + { + c[k-1]++; + if(c[k-1]>1) + { + f=1; + printf("False:Invalid initial Sudoku matrix!"); + printf("The number %d in the block %d has been used!",k,r); + break; + } + } + } + if(f==1) + break; + } + if(f==1) + break; + } + if(f==1) + break; + } + if(f==1) + break; + } + if(d==0&&e==0&&f==0) + printf("True:Valid initial Sudoku matrix!\n"); + } +} +bool p(int board[][9]) +{ + int n=10,m=10; + flag: + if(n==10) + { + for(int i=0;i<9;i++) + { + for(int j=0;j<9;j++) + { + if(board[i][j]==0) + { + n=i; + m=j; + goto flag; + } + if(i==8&&j==8) + return true; + } + } + } + for(int x=1;x<=9;x++) + { + board[n][m]=x; + int c=w(board); + board[n][m]=0; + if(c==0) + { + board[n][m]=x; + if(p(board)) + return true; + board[n][m]=0; + } + } + return false; +} +int main() +{ + int board[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"); + b(board); + ww(board); + int n=w(board); + if(n==1) + printf("No Solution!\n"); + else + if(p(board)) + { + printf("The solution of Sudoku matrix:\n"); + p(board); + b(board); + } + else + printf("No Solution!\n"); + return 0; +}