#include <cstdio>
#include <cstdlib>
using namespace std;
int a[9][9];
int dfs(int m);
bool canplace(int row, int col, int num);
void output();
int main()
{
int i, j;
for(i = 0; i < 9; i ++)
for(j = 0; j < 9; j ++)
scanf("%d", &a[i][j]);
dfs(0);
return 0;
}
bool canplace(int row, int col, int num)
{
int i, j, trow, tcol;
trow = row / 3 * 3;//找到在该小方格的左上方格子
tcol = col / 3 * 3;
for(i = 0; i < 9; i ++)//行列无冲突
if(a[row][i] == num || a[i][col] == num)
return 0;
for(i = 0; i < 3; i ++)//小方格内无冲突
for(j = 0; j < 3; j ++)
if(a[trow + i][tcol + j] == num)
return 0;
return 1;
}
void output()
{
for(int i = 0; i < 9; i ++)
for(int j = 0; j < 9; j ++)
printf("%d%c", a[i][j], j==8?'\n':' ');
exit(0);
}
int dfs(int m)//rol = m / 9; col = m % 9;
{
int row = m / 9;
int col = m % 9;
if(m == 81) output();
if(a[row][col] > 0) dfs(m + 1);//如果是题目已知的点,则放下一个
else
{
for(int i = 1; i <= 9; i++)
if(canplace(row, col, i))
{
a[row][col] = i;
dfs(m + 1);
a[row][col] = 0;//回溯
}
}
}
洛谷P1784_数独游戏
最新推荐文章于 2024-02-05 18:32:59 发布