POJ 2676 数独+dfs深搜
数独
#include "cstdio" #include "cstring" #include "cstdlib" #include "iostream" using namespace std; #include <cstdio> int num,v[82][2],map[10][10];///v存储需要填的位置 bool finished; bool judge(int x,int y,int k) { int i,j,it,jt; for(i=0; i<9; i++) { if(map[i][y]==k) return false;///同行同列不能有同数字 if(map[x][i]==k) return false; } it=(x/3)*3; jt=(y/3)*3; for(i=0; i<3; i++)///一块内数字不能相同 for(j=0; j<3; j++) if(map[i+it][j+jt]==k) return false; return true; } void dfs(int k) { if(finished) return; if(k>=num) { finished =true; for(int i=0; i<9; i++) { for(int j=0; j<9; j++) printf("%d",map[i][j]); printf("\n"); } } for(int i=1;i<=9;i++)///1到9 9个数字 { int x=v[k][0];///填第k个空 int y=v[k][1]; if(judge(x,y,i))///能填吗? { map[x][y]=i; dfs(k+1);///下一个数 map[x][y]=0; } } } int main() { int t; scanf("%d\n",&t); while(t--) { num=0; finished =false; char c; for(int i=0;i<9;i++) { for(int j=0;j<9;j++) { scanf("%c",&c); map[i][j]=c-'0'; if(map[i][j]==0) { v[num][0]=i; v[num][1]=j; num++; } } getchar(); } dfs(0); } return 0; }