您的位置:首页 > 其它

POJ 2676 sudoku dfs

2014-12-10 19:51 369 查看
题意:数独游戏,用1-9个数字填满9 * 9 的格子,让每行,每列,每个小的3 * 3 格子都有唯一的一个数字。

思路:简单的dfs。

代码如下:

#include <cstdio>
#include <algorithm>
#include <cstring>

using namespace std;

char sudoku[9][20];
bool rows[9][10];
bool columns[9][10];
bool blocks[9][10];

bool dfs(int n)
{
if(n == 81) return true;
int x = n / 9, y = n % 9;
int id = x / 3 * 3 + y / 3;
if(sudoku[x][y] != 0)
return dfs(n+1);
else{
for(int i = 1; i <= 9; ++i){
if(!rows[x][i] && !columns[y][i] && ! blocks[id][i]){
rows[x][i] = columns[y][i] = blocks[id][i] = true;
sudoku[x][y] = i;
if(dfs(n+1)) return true;
rows[x][i] = columns[y][i] = blocks[id][i] = false;
sudoku[x][y] = 0;
}
}
}
return false;
}

int main(void)
{
//freopen("in","r",stdin);
int T;
scanf("%d",&T);
while(T--){
memset(rows,0,sizeof(rows));
memset(columns,0,sizeof(columns));
memset(blocks,0,sizeof(blocks));
for(int i = 0; i < 9; ++i)
scanf("%s",sudoku[i]);
for(int i = 0; i < 9; ++i){
for(int j = 0; j < 9; ++j){
sudoku[i][j] -= '0';
if(sudoku[i][j] != 0){
rows[i][sudoku[i][j]] = true;
columns[j][sudoku[i][j]] = true;
blocks[i / 3 * 3 + j / 3][sudoku[i][j]] = true;
}
}
}
dfs(0);
for(int i = 0; i < 9; ++i)
for(int j = 0; j < 9; ++j)
sudoku[i][j] += '0';
for(int i = 0; i < 9; ++i)
printf("%s\n",sudoku[i]);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: