DFS实质就是一种枚举,不过借助递归实现;
DFS的基本模式:
void dfs(int step)
{
判断边界;
for(int i=1;i<=n;++i)//尝试每一种可能;
{
dfs(step+1);/‘/继续下一步
}
返回;
}
例题:
问题描述:
现有等式:【】【】【】+【】【】【】=【】【】【】,要求在每一个【】中填入0~9中某一个数字,最后使得等式成立且每个数字使用一次,输出等式,并输出总个数;例如782+154=936,154+782=936只计数一次,但输出时都输出;
基本思路:
对每一个【】进行深搜;
代码如下:
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <algorithm>
using namespace std;
int a[10],book[10];
int total;
void dfs(int step)
{
if(step==10)
{
if(a[1]*100+a[2]*10+a[3]+a[4]*100+a[5]*10+a[6]==a[7]*100+a[8]*10+a[9])
{
for(int i=1;i<=9;i++)
{
printf("%d",a[i]);
if(i==3) printf("+");
else if(i==6) printf("=");
}
printf("\n");
total++;
}
}
for(int i=1;i<=9;i++)//可以体现枚举;
{
if(book[i]==0)
{
a[step]=i;
book[i]=1;
dfs(step+1);//对下一个【】进行深搜;
book[i]=0;//恢复;
}
}
return;
}
int main()
{
dfs(1);
printf("%d\n",total/2);
return 0;
}