hdu: 1426 ( Sudoku Killer )
http://acm.hdu.edu.cn/showproblem.php?pid=1426
Problem : 1426 ( Sudoku Killer ) Judge Status : Accepted RunId : 3712414 Language : C++ Author : zjut11018 Code Render Status : Rendered By HDOJ C++ Code Render Version 0.01 Beta 借助此题学习DFS 思路:把需要填数的位置保存到q中,再递归求解 #include<iostream> using namespace std; int map[9][9]; int num,ok; struct node { int x,y; }q[81]; bool check(int k,int cur)//判断所填的数是否合法 k为准备要填的数,cur为要填的位置在q中的编号 { for(int i=0;i<9;i++) { if(map[q[cur].x][i]==k||map[i][q[cur].y]==k)return 0;//判断行和列是否用过k } int x=q[cur].x/3*3; int y=q[cur].y/3*3; for(int i=0;i<3;i++)//判断9个格子的小块是否用过k for(int j=0;j<3;j++) { if(map[x+i][y+j]==k)return 0; } return 1; } void DFS(int cur) { if(cur==num)//数独表形成 { for(int i=0;i<9;i++)//注意应该在这个位置就马上打印 否则回溯掉 表就没了 { for(int j=0;j<8;j++) { printf("%d ",map[i][j]); } printf("%d\n",map[i][8]); } ok=1; return; } else { for(int i=1;i<=9;i++) { if(check(i,cur)&&!ok)//填的数合法且最终答案还未形成 { map[q[cur].x][q[cur].y]=i;//填表 DFS(cur+1);//递归 map[q[cur].x][q[cur].y]=0;//回溯 } } } return; } int main() { char s; int cas=0; while(cin>>s) { num=0; if(s=='?')map[0][0]=0; else map[0][0]=s-'0'; for(int i=0;i<9;i++) for(int j=0;j<9;j++) { if(!(i==0&&j==0))cin>>s; if(s=='?') { map[i][j]=0; q[num].x=i;q[num].y=j;//把问号格子的坐标存在q里 num++; } else map[i][j]=s-'0'; } ok=0; if(cas++)printf("\n"); DFS(0); } }