dfs 數獨
阿新 • • 發佈:2018-12-05
分析:
int row[10][10];//row[i][x]=1表示第i行中數字x已經出現
int col[10][10];//col[i][x]=1表示第i列中數字x已經出現
int grid[10][10];//grid[i][x]=1表示第i個小棋盤中數字x已經出現.
然後假設當前網格座標為(r,c),那麼它對應於第幾(k)個小棋盤呢?可以很容易通過分析得出k= (r/3)*3+c/3 .(其中r,c,k都是從0計數的)
#include<cstdio> #include<cstring> using namespace std; const int maxn=10; int map[maxn][maxn]; bool row[maxn][maxn]; bool col[maxn][maxn]; bool grid[maxn][maxn]; bool dfs(int r,int c) { if(r==9) return true;//構造完畢 bool flag=false; if(map[r][c]) { if(c==8) flag=dfs(r+1,0); else flag=dfs(r,c+1); return flag; } int k=(r/3)*3+c/3; for(int i=1;i<=9;i++)if(!row[r][i]&&!col[c][i]&&!grid[k][i]) { row[r][i]=col[c][i]=grid[k][i]=true; map[r][c]=i; if(c==8) flag=dfs(r+1,0); else flag=dfs(r,c+1); if(flag) return true; map[r][c]=0; row[r][i]=col[c][i]=grid[k][i]=false; } return false; } int main() { int T; scanf("%d",&T); while(T--) { memset(row,0,sizeof(row)); memset(col,0,sizeof(col)); memset(grid,0,sizeof(grid)); for(int i=0;i<9;i++) for(int j=0;j<9;j++) { char x; scanf(" %c",&x); map[i][j]= x-'0'; if(map[i][j]) { row[i][map[i][j]]=true; col[j][map[i][j]]=true; int k=(i/3)*3+j/3; grid[k][map[i][j]]=true; } } dfs(0,0); for(int i=0;i<9;i++) { for(int j=0;j<9;j++) printf("%d",map[i][j]); printf("\n"); } } return 0; }