输入:
1 4 0 0 9 0 6 0 0
6 0 0 4 0 0 0 0 0
0 9 5 0 3 6 0 0 0
3 0 0 0 0 0 0 5 6
9 0 4 0 0 0 0 7 0
0 6 0 0 0 0 4 0 0
0 2 0 0 1 0 7 4 0
0 0 0 5 4 0 1 2 8
0 0 0 0 0 2 0 6 0
输出
1 4 3 2 9 5 6 8 7
6 7 2 4 8 1 3 9 5
8 9 5 7 3 6 2 1 4
3 1 7 8 2 4 9 5 6
9 5 4 1 6 3 8 7 2
2 6 8 9 5 7 4 3 1
5 2 9 6 1 8 7 4 3
7 3 6 5 4 9 1 2 8
4 8 1 3 7 2 5 6 9
深度优先搜索,代码实现容易,适合初学者使用。
但是如果用递归实现,务必注意程序该如何结束搜索并返回。
#include <iostream>
#include <cstdlib>
#include <cstdio>
using namespace std;
int dp[10][10];
bool ok=0;
bool look(int p,int num)
{
int i,j;
j=p/9;
for(i=0;i<9;i++)
if(dp[j][i]==num)
return 0;
j=p%9;
for(i=0;i<9;i++)
if(dp[i][j]==num)
return 0;
int m,n;
m=p/9/3*3;
n=p%9/3*3;
for(i=m;i<m+3;i++)
for(j=n;j<n+3;j++)
if(dp[i][j]==num) return 0;
return 1;
}
bool dfs(int n)
{
if(n>80)
{
ok=1;
return 0;
}
if(dp[n/9][n%9])
{
dfs(n+1);
return 0;
}
int i;
for(i=1;i<=9;i++)
if(look(n,i))
{
dp[n/9][n%9]=i;
dfs(n+1);
if(ok) return 0;
dp[n/9][n%9]=0;
}
return 0;
}
int main()
{
int i,j,k;
for(i=0;i<9;i++)
for(j=0;j<9;j++)
cin>>dp[i][j];
dfs(0);
for(i=0;i<9;i++,cout<<endl)
for(j=0;j<9;j++)
cout<<dp[i][j]<<" ";
return 0;
}
//windyuan2020-10-09-22-37