此程序多解只出一个解,需要多解请自行修改,或者联系本人。。。
你一定听说过“数独”游戏。如: 
玩家需要根据 9× 9盘面上的已知数字,推理出所有剩余空格的数字,并满足每一行、每一列、每一个同色九宫内的数字均含 1-9,不重复。 数独的答案都是唯一的,所以,多个解也称为无解。 本图的数字据说是芬兰数学家花了3个月的时间设计出来的较难的题目。但对会使用计算机编程的你来说,恐怕易如反掌了。 本题的要求就是输入数独题目,程序输出数独的唯一解。我们保证所有已知数据的格式都是合法的,并且题目有唯一的解。 格式要求,输入9行,每行9个字符,0代表未知,其它数字为已知。 输出9行,每行9个数字表示数独的解。 例如: 输入(即图中题目): 005300000 800000020 070010500 400005300 010070006 003200080 060500009 004000030 000009700 程序应该输出: 145327698 839654127 672918543 496185372 218473956 753296481 367542819 984761235 521839764 再例如,输入: 800000000 003600000 070090200 050007000 000045700 000100030 001000068 008500010 090000400 程序应该输出: 812753649 943682175 675491283 154237896 369845721 287169534 521974368 438526917 796318452
代码如下: #include<stdio.h> int ds[9][9],sd[9][9];int temp=0; void tspd(int a[],int count) { inti,j,k; if(temp) return; if(count<0) { {for(i=0;i<9;i++) { for(j=0;j<9;j++) printf("%d",ds[ i][j]); printf("\n"); }printf("\n");} temp=1; return; } else { i=a[count]/10; j=a[count]%10; for(k=1;k<=9;k++) { int x; ds[ i][j]=k; for(x=0;x<9;x++) if(ds[ i][j]==sd[ i][x]){x=100;break;} if(x==100)continue; for(x=0;x<9;x++) if(ds[ i][j]==sd[x][j]){x=100;break;} if(x==100)continue; if(j<8&&ds[ i][j]==ds[ i][j+1])continue; if(j<7&&ds[ i][j]==ds[ i][j+2])continue; if(j<6&&ds[ i][j]==ds[ i][j+3])continue; if(j<5&&ds[ i][j]==ds[ i][j+4])continue; if(j<4&&ds[ i][j]==ds[ i][j+5])continue; if(j<3&&ds[ i][j]==ds[ i][j+6])continue; if(j<2&&ds[ i][j]==ds[ i][j+7])continue; if(j<1&&ds[ i][j]==ds[ i][j+8])continue; if(i<8&&ds[ i][j]==ds[i+1][j])continue; if(i<7&&ds[ i][j]==ds[i+2][j])continue; if(i<6&&ds[ i][j]==ds[i+3][j])continue; if(i<5&&ds[ i][j]==ds[i+4][j])continue; if(i<4&&ds[ i][j]==ds[i+5][j])continue; if(i<3&&ds[ i][j]==ds[i+6][j])continue; if(i<2&&ds[ i][j]==ds[i+7][j])continue; if(i<1&&ds[ i][j]==ds[i+8][j])continue; if(i<8&&i>5) { if(j%3==2&&(ds[ i][j]==ds[i+1][j]||ds[ i][j]==ds[i+1][j-1]||ds[ i][j]==ds[i+1][j-2]))continue; if(j%3==1&&(ds[ i][j]==ds[i+1][j]||ds[ i][j]==ds[i+1][j-1]||ds[ i][j]==ds[i+1][j+1]))continue; if(j%3==0&&(ds[ i][j]==ds[i+1][j]||ds[ i][j]==ds[i+1][j+1]||ds[ i][j]==ds[i+1][j+2]))continue; } if(i==6) { if(j%3==2&&(ds[ i][j]==ds[i+2][j]||ds[ i][j]==ds[i+2][j-1]||ds[ i][j]==ds[i+2][j-2]))continue; if(j%3==1&&(ds[ i][j]==ds[i+2][j]||ds[ i][j]==ds[i+2][j-1]||ds[ i][j]==ds[i+2][j+1]))continue; if(j%3==0&&(ds[ i][j]==ds[i+2][j]||ds[ i][j]==ds[i+2][j+1]||ds[ i][j]==ds[i+2][j+2]))continue; } if(i<5&&i>2) { if(j%3==2&&(ds[ i][j]==ds[i+1][j]||ds[ i][j]==ds[i+1][j-1]||ds[ i][j]==ds[i+1][j-2]))continue; if(j%3==1&&(ds[ i][j]==ds[i+1][j]||ds[ i][j]==ds[i+1][j-1]||ds[ i][j]==ds[i+1][j+1]))continue; if(j%3==0&&(ds[ i][j]==ds[i+1][j]||ds[ i][j]==ds[i+1][j+1]||ds[ i][j]==ds[i+1][j+2]))continue; } if(i==3) { if(j%3==2&&(ds[ i][j]==ds[i+2][j]||ds[ i][j]==ds[i+2][j-1]||ds[ i][j]==ds[i+2][j-2]))continue; if(j%3==1&&(ds[ i][j]==ds[i+2][j]||ds[ i][j]==ds[i+2][j-1]||ds[ i][j]==ds[i+2][j+1]))continue; if(j%3==0&&(ds[ i][j]==ds[i+2][j]||ds[ i][j]==ds[i+2][j+1]||ds[ i][j]==ds[i+2][j+2]))continue; } if(i<2&&i>=0) { if(j%3==2&&(ds[ i][j]==ds[i+1][j]||ds[ i][j]==ds[i+1][j-1]||ds[ i][j]==ds[i+1][j-2]))continue; if(j%3==1&&(ds[ i][j]==ds[i+1][j]||ds[ i][j]==ds[i+1][j-1]||ds[ i][j]==ds[i+1][j+1]))continue; if(j%3==0&&(ds[ i][j]==ds[i+1][j]||ds[ i][j]==ds[i+1][j+1]||ds[ i][j]==ds[i+1][j+2]))continue; } if(i==0) { if(j%3==2&&(ds[ i][j]==ds[i+2][j]||ds[ i][j]==ds[i+2][j-1]||ds[ i][j]==ds[i+2][j-2]))continue; if(j%3==1&&(ds[ i][j]==ds[i+2][j]||ds[ i][j]==ds[i+2][j-1]||ds[ i][j]==ds[i+2][j+1]))continue; if(j%3==0&&(ds[ i][j]==ds[i+2][j]||ds[ i][j]==ds[i+2][j+1]||ds[ i][j]==ds[i+2][j+2]))continue; } tspd(a,count-1); } return; } } int main() { inti,j,a[81],count=0; charc; for(i=0;i<9;i++) for(j=0;j<9;j++) { c=getchar(); if(c=='\n') c=getchar(); ds[ i][j]=(int)(c-'0'); } for(i=0;i<9;i++) for(j=0;j<9;j++) sd[ i][j]=ds[ i][j]; printf("\n"); for(i=0;i<9;i++) for(j=0;j<9;j++) if(!ds[ i][j]) a[count++]=i*10+j; tspd(a,count-1); return0; }
|