如何理解dfs-输出全排列问题?


例题都是来自《啊哈!算法》,全排列的代码也是来自该书的(稍微改了一下)

例题一:输出数的全排列

以有6张牌为例,图示说明如下,我前面的那个标记性数组的元素只要前面标记成了true , 后面依次
遍历这个bool数组的时候,只会把false元素放到盒子a里面,所以每次输出不同的牌
而且就是因为你前面的dfs是放在循环里面的,
所以会导致for里面又嵌套了for(其实看图就知道这个图是4层for了,真的恐怖)我个人认为其实还是
有种暴力枚举的意思,只不过就是聪明了一点,利用标记来快速枚举,不会导致重复的现象
在这里插入图片描述
代码示例,emm ,需要-std=c++11的命令进行编译,我有点怀念printf了。。

#include <iostream>
using namespace std;
const int MAX = 10;
const int   N =  5;
bool book[N];
int  a[N + 1];
void dfs(int step)
{
    if(step > N)
    {
        for(int i = 1 ; i <= N ; i++)
        {
            printf("%d" , a[i]);
        }
        printf("\n");
        return;
    }
    for(int i = 1 ; i <= N ; i++)
    {
        if(book[i] == false)
        {
            a[step] = i;
            book[i] = true;
            dfs(step + 1);
            book[i] = false;
        }
    }
    return;
}
int main()
{
    dfs(1);
    return 0;
}

例题二:🆗🆗🆗+🆗🆗🆗=🆗🆗🆗

暂时忽略一下里面的ok,其实是填个位数字进去使得等式成立
思想跟上面的也是完全相同,我是吃饭吃着吃着就想到怎么模仿例题一来暴力枚举的
也是一样的思路,没有看过《啊哈!算法》的答案

#include <iostream>

using namespace std;
const int MAX = 10;
bool book[MAX];
int  a[MAX];
void dfs(int step)
{
    int i;
    if(step > 9)
    {
        int op1 = 100 * a[1] + 10 * a[2] + a[3] ;
        int op2 = 100 * a[4] + 10 * a[5] + a[6] ;
        int op3 = 100 * a[7] + 10 * a[8] + a[9] ;
        if( op1 + op2 == op3)
        {
            printf("%d + %d = %d\n" , op1 , op2 , op3);
        }
        return;
    }
    for(i = 1 ; i <= 9 ; i++)
    {
        if(book[i] == false)
        {
            a[step] = i;
            book[i] = true;
            dfs(step+1);
            book[i] = false;
        }
    }
    return;
}
int main()
{
    dfs(1);
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

dareu_4523

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值