dfs例题——四阶数独
例题:给出一个4×4的方格,每个格子只能填1~4的整数,要求每行、每列和四等分更小的正方形部分都刚好由1~4组成。
问:一共有多少种合法的填写方法并输出这些填写方法。
分析:如果用穷举的方法,就得使用16层for循环,会有4^16约为42亿种情况,这样处理起来就会很低效。
为了提高效率,所以应当做到一发现某个数字不符合要求,就终止并进行下一次情况。
```cpp
//四阶数独的个数并输出如何填数(深度优先搜索(dfs))
#include<bits/stdc++.h>
#define N 5
using namespace std;
int a[N*N],n=4*4,ans=0;
int r[N][N],c[N][N],sq[N][N];
void dfs(int x)
{
if(x>n)
{
ans++;//如果数已经填满,就加一次结果的数量
for(int i=1;i<=n;i++)//输出填数方案
{
cout << a[i] << ' ' ;
if(i%4==0)putchar(10);
}
putchar(10);
return;
}
int row=(x-1)/4+1;//填入数字所在的行
int col=(x-1)%4+1;//填入数字所在的列
int block=(row-1)/2*2+(col-1)/2+1;//填入数字所在的小方块
for(int i=1;i<=4;i++)
{
if(r[row][i]==0&&c[col][i]==0&&sq[block][i]==0)
{
a[x]=i;//记录填的数
r[row][i]=1,c[col][i]=1,sq[block][i]=1;//标记行,列,小方块内已有这个数
dfs(x+1);//进行下一次递归
r[row][i]=0,c[col][i]=0,sq[block][i]=0;//回溯以后取消占位
}
}
}
int main()
{
dfs(1);
cout << ans << endl ;
return 0;
}
```
浙公网安备 33010602011771号