poj2676 Sudoku(搜索)
Posted a_clown_cz
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了poj2676 Sudoku(搜索)相关的知识,希望对你有一定的参考价值。
题目链接:http://poj.org/problem?id=2676
题意:9*9的方格,0代表没数字,其他代表数字,请在格子中填入1~9的数字,使得在每行,每列和每个3*3的方块中,1~9的数字每个都出现一次。
如果解不唯一输出任意一组即可。
思路:只要满足上诉条件,暴力搜就可以通过了。
代码:
#include<iostream> #include<cstring> using namespace std; int mp[10][10]; ///九宫格 int row[10][10]; ///row[i][x] 标记在第i行中数字x是否出现了 int col[10][10]; ///col[j][y] 标记在第j列中数字y是否出现了 int grid[10][10]; ///grid[k][x] 标记在第k个3*3子格中数字z是否出现了 ///(这里说明的字母不代表下面程序中的变量) int DFS(int x,int y) { if(x==10) return 1; int flag=0; if(mp[x][y]) { if(y==9)flag=DFS(x+1,1); else flag=DFS(x,y+1); if(flag) return 1; ///回溯 else return 0; } else { int k=3*((x-1)/3)+(y-1)/3+1; for(int i=1; i<=9; i++) ///枚举数字1~9填空 if(!row[x][i] && !col[y][i] && !grid[k][i]) { mp[x][y]=i; row[x][i]=1; col[y][i]=1; grid[k][i]=1; if(y==9) flag=DFS(x+1,1); else flag=DFS(x,y+1); if(!flag) ///回溯,继续枚举 { mp[x][y]=0; row[x][i]=0; col[y][i]=0; grid[k][i]=0; } else return 1; } } return 0; } int main(int i,int j) { int test; cin>>test; while(test--) { memset(row,0,sizeof(row)); memset(col,0,sizeof(col)); memset(grid,0,sizeof(grid)); char MAP[10][10]; for(i=1; i<=9; i++) for(j=1; j<=9; j++) { cin>>MAP[i][j]; mp[i][j]=MAP[i][j]-‘0‘; if(mp[i][j]) { int k=3*((i-1)/3)+(j-1)/3+1; row[i][ mp[i][j] ]=1; col[j][ mp[i][j] ]=1; grid[k][ mp[i][j] ]=1; } } DFS(1,1);///最左上角个数开始搜索,是坐标 for(i=1; i<=9; i++) { for(j=1; j<=9; j++) cout<<mp[i][j]; cout<<endl; } } return 0; }
以上是关于poj2676 Sudoku(搜索)的主要内容,如果未能解决你的问题,请参考以下文章