poj 2676 DFS水题
/* 题意:数独 题解:DFS,爆搜; 据闻可用跳跃表做。。。。。 */ #include <cstdio> #include <cstring> int m[10][10]; bool flag; void dfs(int pos) { if (pos == 81) { for(int i=0; i<9; i++) { char s[10]; for(int j=0; j<9; j++) { s[j] = m[i][j] + '0'; printf("%c",s[j]); } printf("\n"); } flag = true; return ; } if (flag) return ; if (m[pos/9][pos%9]) { dfs(pos+1); } else { int x=pos/9,y=pos%9; bool vis[10]; memset(vis,false,sizeof(vis)); for(int i=0; i<9; i++) { if (x != i) vis[m[i][y]] = true; if (y != i) vis[m[x][i]] = true; } int tx = x/3*3; int ty = y/3*3; for(int i=0; i<3; i++) { for(int j=0; j<3; j++) { if (tx+i==x && ty+j==y) continue; vis[m[tx+i][ty+j]] = true; } } for(int i=1; i<=9; i++) { if (!vis[i]) { m[x][y] = i; dfs(pos+1); if (flag) return ; m[x][y] = 0; } } } } int main(void) { int t; char s[15]; scanf("%d",&t); while (t--) { for(int i=0; i<9; i++) { scanf("%s",s); for(int j=0; j<9; j++) { m[i][j] = s[j] - '0'; } } flag = false; dfs(0); } return 0; }