dfs的入口可以是遍历的个数n也可以是坐标i,j,就是一些运算上的差别。是对每一种空间的遍历
#include<iostream>
using namespace std;
int empty[9][9] = { 0 };//记录该行该列有几个空格
int a[9][9];//输入数独
bool flag = false;
bool check(int n, int value)
{
int row = n / 9;
int column = n % 9;
//行
for (int j = 0; j < 9; j++)
{
if (a[row][j] == value)
{
return false;
}
}
//列
for (int j = 0; j < 9; j++)
{
if (a[j][column] == value)
{
return false;
}
}
//九宫格
int rr = row / 3;
int cc = column / 3;
for (int i = 0; i < 3; i++)
{
for (int j = 0; j < 3; j++)
{
if (a[i + rr * 3][j + cc * 3] == value)
{
return false;
}
}
}
return true;
}
void dfs(int n)
{
if (n >= 81)
{
flag = true;
return;
}
else {
if (a[n / 9][n % 9] != 0)
{
n++;
dfs(n);
}
else {//空格填数
for (int i = 1; i <= 9; i++)
{
if (check(n, i))
{
a[n / 9][n % 9] = i;
dfs(n + 1);
if (flag)
return;
a[n / 9][n % 9] = 0;
}
}
}
}
}
int main()
{
for (int i = 0; i < 9; i++)
{
for (int j = 0; j < 9; j++)
{
cin >> a[i][j];
}
}
dfs(0);
for (int i = 0; i < 9; i++)
{
for (int j = 0; j < 9; j++)
{
cout << a[i][j]<<' ';
}
cout << endl;
}
return 0;
}


京公网安备 11010502036488号