搜索......每一个都去试一遍.....A了,代码:
#include<iostream> #include<cstring> using namespace std; int a[1100][1100]; int ans1[1100][1100],ans2[1100][1100],ans3[1100][1100]; int n; bool djy=0; void dfs(int x,int y) { if(djy==1) return ;//为了不OLE.... if(a[x][y]!=0) { //有数 if(x==9&&y==9) { //输出 for(int i=1; i<=9; i++) { for(int j=1; j<=9; j++) { cout<<a[i][j]; } cout<<endl; } djy=1; cout<<endl; return ; } if(y==9) { //行数加加 dfs(x+1,1); } else { //列数加加 dfs(x,y+1); } } if(a[x][y]==0) { //没数 for(int i=1; i<=9; i++) { if(ans1[x][i]==0&&ans2[y][i]==0&&ans3[(x-1)/3*3+(y-1)/3+1][i]==0) { //判断 a[x][y]=i; ans1[x][i]=1; ans2[y][i]=1; ans3[(x-1)/3*3+(y-1)/3+1][i]=1; if(x==9&&y==9) { for(int i=1; i<=9; i++) { for(int j=1; j<=9; j++) { cout<<a[i][j]; } cout<<endl; } djy=1; cout<<endl; return ; } if(y==9) dfs(x+1,1);//和上面的一样 else dfs(x,y+1); a[x][y]=0; ans1[x][i]=0; ans2[y][i]=0; ans3[(x-1)/3*3+(y-1)/3+1][i]=0;//回溯 } } } } int main() { cin>>n; for(int k=1; k<=n; k++) { memset(ans1,0,sizeof(ans1));//赋初值 memset(ans2,0,sizeof(ans2)); memset(ans3,0,sizeof(ans3)); for(int i=1; i<=9; i++) { for(int j=1; j<=9; j++) { char ch; cin>>ch; a[i][j]=ch-'0'; if(a[i][j]>0) { ans1[i][a[i][j]]=1;//标记有数 ans2[j][a[i][j]]=1;//同上 ans3[(i-1)/3*3+(j-1)/3+1][a[i][j]]=1;//宫格公式..... } } } djy=0; dfs(1,1); } }
A了QwQ(不小心点了格式化)