此程序多解只出一個(gè)解,需要多解請(qǐng)自行修改,或者聯(lián)系本人。。。
你一定聽說過“數(shù)獨(dú)”游戲。如: 
玩家需要根據(jù) 9× 9盤面上的已知數(shù)字,推理出所有剩余空格的數(shù)字,并滿足每一行、每一列、每一個(gè)同色九宮內(nèi)的數(shù)字均含 1-9,不重復(fù)。 數(shù)獨(dú)的答案都是唯一的,所以,多個(gè)解也稱為無解。 本圖的數(shù)字據(jù)說是芬蘭數(shù)學(xué)家花了3個(gè)月的時(shí)間設(shè)計(jì)出來的較難的題目。但對(duì)會(huì)使用計(jì)算機(jī)編程的你來說,恐怕易如反掌了。 本題的要求就是輸入數(shù)獨(dú)題目,程序輸出數(shù)獨(dú)的唯一解。我們保證所有已知數(shù)據(jù)的格式都是合法的,并且題目有唯一的解。 格式要求,輸入9行,每行9個(gè)字符,0代表未知,其它數(shù)字為已知。 輸出9行,每行9個(gè)數(shù)字表示數(shù)獨(dú)的解。 例如: 輸入(即圖中題目): 005300000 800000020 070010500 400005300 010070006 003200080 060500009 004000030 000009700 程序應(yīng)該輸出: 145327698 839654127 672918543 496185372 218473956 753296481 367542819 984761235 521839764 再例如,輸入: 800000000 003600000 070090200 050007000 000045700 000100030 001000068 008500010 090000400 程序應(yīng)該輸出: 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; }
|