int fixed[9][9]; void PRINT(int sudu[],int i,int j) { for(int i=0;i<9;i++) { for(int j=0;j<9;j++) { printf("%2d,",sudu[i*9+j]); } printf("\n"); } } void tryNext(int sudu[],int i,int j) { //if(valid) int num=1; bool valid=true; if(fixed[i][j]) { if(j>=8) { if(i==8) { PRINT(sudu,i,j); } else tryNext(sudu,i+1,0); } else tryNext(sudu,i,j+1); return; } for( num=1;num<=9;num++) { //行是否冲突 int k=0; for(;k<9;k++) { if(sudu[i*9+k]==num) { goto NEXT; } } //列是否冲突 for(k=0;k<9;k++) { if(sudu[k*9+j]==num){ goto NEXT; } } //小矩形是否冲突 int h = i/3; int l = j/3; for(int m=0;m<3;m++) { for(int n=0;n<3;n++) if(sudu[(h*3+m)*9+(l*3)+n]==num ){ goto NEXT; } } if(valid) { //都不冲突 sudu[i*9+j]=num; if(j>=8) { if(i==8) { PRINT(sudu,i,j); } else { tryNext(sudu,i+1,0); } } else tryNext(sudu,i,j+1); } NEXT:; } sudu[i*9+j]=0; } int main(int argc,char*argv[]) { int sudu[9][9]={ 8,+0,+0,+0,+0,+0,+0,+0,+0, +0,+0, 3, 6,+0,+0,+0,+0,+0, +0, 7,+0,+0, 9,+0, 2,+0,+0, +0, 5,+0,+0,+0, 7,+0,+0,+0, +0,+0,+0,+0, 4, 5, 7,+0,+0, +0,+0,+0, 1,+0,+0,+0, 3,+0, +0,+0, 1,+0,+0,+0,+0, 6, 8, +0,+0, 8, 5,+0,+0,+0, 1,+0, +0, 9,+0,+0,+0,+0, 4,+0,+0, }; for(int i=0;i<9;i++) { for(int j=0;j<9;j++) { if(sudu[i][j]!=0) fixed[i][j] = 1; } } tryNext(&sudu[0][0],0,0); return 0; }
这个不管什么样的初始化,全都重新搜索一遍,会搜索所有可能的结果,而不是搜索到结果后就停止的那种,暴力法。