http://acm.hdu.edu.cn/showproblem.php?pid=1426 #include<iostream> using namespace std; #define N 11 char map[N][N]; int n; bool flag; struct node { int x,y; }p[85]; void out() { for(int i=0;i<9;i++) { printf("%c",map[i][0]); for(int j=1;j<9;j++) printf(" %c",map[i][j]); printf("/n"); } } bool _find(int index,char k) { int x=p[index].x; int y=p[index].y; for(int j=0;j<9;j++) if(j!=y&&map[x][j]==k) return false; for(int i=0;i<9;i++) if(i!=x&&map[i][y]==k) return false; int k1=x/3*3; int k2=y/3*3; for(int i=k1;i<k1+3;i++) for(int j=k2;j<k2+3;j++) { if(i==x&&j==y) continue; if(map[i][j]==k) return false; } return true; } void dfs(int index,int count) { int k; if(count==n) { flag=1; out(); return; } if(flag) return; for(k=1;k<=9;k++) if(_find(index,k+'0')) { map[p[index].x][p[index].y]=k+'0'; dfs(index+1,count+1); if(flag) return; map[p[index].x][p[index].y]='?'; } } int main(void) { char ch[5]; int i,j; int k=1; while(~scanf("%s",ch)) { n=0; flag=0; if(ch[0]=='?') { p[n].x=p[n].y=0; n++; } map[0][0]=ch[0]; for(j=1;j<9;j++) { scanf("%s",ch); map[0][j]=ch[0]; if(ch[0]=='?') { p[n].x=0;p[n].y=j; n++; } } for(i=1;i<9;i++) for(j=0;j<9;j++) { scanf("%s",ch); map[i][j]=ch[0]; if(ch[0]=='?') { p[n].x=i;p[n].y=j; n++; } } if(k!=1) printf("/n"); k++; dfs(0,0); } } 把'?'的点存起来,不要直接放在数组里暴搜,不然会超时