深搜题,对于每一个 '?' 的格子,依次判断填入 1~9 是否满足所在的行、列、小九宫格不存在相同的数字。
#include <iostream>
using namespace std;
struct Point //'?'的位置
{
int x;
int y;
} p[100];
int mp[10][10]; //数独
int total; //'?'的数量
bool flag; //是否填充好整个数独
//判断是否能将数字k填充到p[cur]所在的格子
bool check(int k, int cur)
{
for (int i = 0; i < 9; i++) //判断p[cur]所在的行和列是否存在数字k
{
if (mp[p[cur].x][i] == k || mp[i][p[cur].y] == k)
return false;
}
int firstX = (p[cur].x / 3) * 3; //p[cur]所在小九宫格的左上角的横坐标
int firstY = (p[cur].y / 3) * 3; //p[cur]所在小九宫格的左上角的纵坐标
for (int i = firstX; i < firstX + 3; i++) //判断p[cur]所在小九宫格是否存在数字k
{
for (int j = firstY; j < firstY + 3; j++)
{
if (mp[i][j] == k)
{
return false;
}
}
}
return true;
}
//深搜,填充整个数独并输出,num表示当前已填充的'?'的数量
void DFS(int num)
{
if (flag)
return;
if (num == total)
{
for (int i = 0; i < 9; i++)
{
for (int j = 0; j < 8; j++)
{
cout << mp[i][j] << " ";
}
cout << mp[i][8] << endl;
}
flag = true;
return;
}
for (int i = 1; i <= 9; i++)
{
if (check(i, num))
{
mp[p[num].x][p[num].y] = i;
DFS(num + 1);
mp[p[num].x][p[num].y] = 0;
}
}
return;
}
int main()
{
int Case = 0;
char s;
while (cin >> s)
{
flag = false;
total = 0;
if (s == '?')
{
mp[0][0] = 0;
p[total].x = 0;
p[total].y = 0;
++total;
}
else
{
mp[0][0] = s - '0';
}
for (int i = 0; i < 9; i++)
{
for (int j = 0; j < 9; j++)
{
if (i == 0 && j == 0)
continue;
cin >> s;
if (s == '?')
{
mp[i][j] = 0;
p[total].x = i;
p[total].y = j;
++total;
}
else
{
mp[i][j] = s - '0';
}
}
}
if (Case++)
cout << endl;
DFS(0);
}
return 0;
}
继续加油。