// dfs习题:
// 输入9行,0代表未知
// 输出9行即最终结果
#include <stdio.h>
#include <stdlib.h>
int main() {
int table[9][9];
//输入数据
for (int i = 0; i < 9; i++) {
for (int j = 0; j < 9; j++) {
scanf("%d", &table[i][j]);
}
}
dfs(table, 0, 0);
return 0;
}
void dfs(int table[9][9], int x, int y)
{
if (x == 9)
{
//打印最终数组数据
my_print(table);
exit(0);
}
// '0'要填入数字
if (table[x][y] == 0)
{
//循环遍历要填入什么数字
for (int k = 1; k <= 9; k++)
{
//检查行,列,九宫格是否含有该数字
if (check(table, x, y, k) == 1)
{
table[x][y] = k;
dfs(table, x + (y + 1) / 9, (y + 1) % 9);
}
}
//回溯
table[x][y] = 0;
}
else
{
//不是0则遍历下一个位置
dfs(table, x + (y + 1) / 9, (y + 1) % 9);
}
}
int check(int table[9][9], int x, int y, int k)
{
//检查行、列是否含有数字k
for (int i = 0; i < 10; i++) {
if (table[i][y] == k || table[x][i] == k) {
return -1;
}
}
//检查九宫格是否含有数字k
//x / 9定位所处行,y / 9定位所处列
x /= 9;
y /= 9;
//定位到所处行、列坐标后遍历九宫格
for (int i = 3 * x; i < 3 * x + 3; i++) {
for (int j = 3 * y; j < 3 * y + 3; j++) {
if (table[i][j] == k) {
return -1;
}
}
}
//当行、列、九宫格内均不包含该数字返回1
return 1;
}
//打印最终九宫格内容
void my_print(int table[9][9]) {
for (int i = 0; i < 10; i++) {
for (int j = 0; j < 10; j++) {
printf("%d ", table[i][j]);
}
printf("\n");
}
}