把0的空格保存起来,dfs之,如果搜不下去,回溯。 #include<iostream> using namespace std; #define N 10 struct node { int i,j; }; node res[N*N]; int a[N][N],tot; bool row[N][N],col[N][N],squ[N][N]; bool found; char line[N]; int trans(int i,int j) { if(i<=2) { if(j<=2)return 0; else if(j<=5)return 1; else return 2; } else if(i<=5) { if(j<=2)return 3; else if(j<=5)return 4; else return 5; } else { if(j<=2)return 6; else if(j<=5)return 7; else return 8; } } void dfs(int s,int val) { int r=res[s].i,c=res[s].j; a[r][c]=val; row[r][val]=true,col[c][val]=true,squ[trans(r,c)][val]=true; if(s==tot-1) { found=true; return ; } int i=res[s+1].i,j=res[s+1].j,k; for(k=1;k<=9&&!found;k++) { if(row[i][k]||col[j][k]||squ[trans(i,j)][k]) continue; dfs(s+1,k); if(!found) a[i][j]=row[i][k]=col[j][k]=squ[trans(i,j)][k]=0; } } int main() { int n,i,j,k,ca; scanf("%d",&ca); while(ca--) { memset(row,0,sizeof(row)); memset(col,0,sizeof(col)); memset(squ,0,sizeof(squ)); found=false; tot=0; for(i=0;i<9;i++) { scanf("%s",line); for(j=0;j<9;j++) { a[i][j]=line[j]-'0'; if(a[i][j]==0) { res[tot].i=i; res[tot].j=j; tot++; } } } for(i=0;i<9;i++) for(j=0;j<9;j++) { if(!a[i][j]) continue; row[i][a[i][j]]=true; col[j][a[i][j]]=true; squ[trans(i,j)][a[i][j]]=true; } for(k=1;k<=9;k++) if(!found) { int h=res[0].i,g=res[0].j; if(row[h][k]||col[g][k]||squ[trans(h,g)][k]) continue; dfs(0,k); if(!found) a[h][g]=row[h][k]=col[g][k]=squ[trans(h,g)][k]=0; } for(i=0;i<9;i++) { for(j=0;j<9;j++) printf("%d",a[i][j]); printf("/n"); } } return 0; }