题意:数独游戏,用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;
}