DFS

来源:互联网 发布:大数据职位 编辑:程序博客网 时间:2024/05/21 17:17

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;
}

0 0