首页 > 代码库 > poj2676 Sudoku(搜索)
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(搜索)
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。