zoukankan      html  css  js  c++  java
  • 深度优先算法-启示篇

    首先不推荐第一次接触深度优先算法就来看这个,你需要看看其他的,有点门道后,看这个就会豁然开朗。

    我不会给你讲什么是深度优先算法,广度优先算法。

    比如打印好几个数的全排列:你可以选择for循环循环出来。那你试试1--100的全排列。

    下面使用深度优先算法(dfs),记住这个单词,你以后常常会见,你也别在学习中遇到一点困难就退缩。

    深度优先搜索是基本算法,你躲不过。

    #include <iostream>
    
    using namespace std;
    /*
     *此代码是来输出1~n的全排列
     */
    int a[10]= {0},book[10]= {0},n=0;
    void dfs(int step)
    {
        int i;
        if(step==n+1)
        {
            for(i=1; i<=n; i++)
            {
                cout<<a[i];
            }
            cout<<endl;
            return ;
        }
        for(i=1; i<=n; i++)
        {
            if(book[i]==0)//手中的牌
            {
                a[step]=i;//将i号扑克牌放入第step个盒子中
                book[i]=1;//将book[i]设置为1.表示i号牌不在手中。
                dfs(step+1);//通过函数的递归调用自己
                book[i]=0;//将刚才的扑克牌收回,进行下一次尝试
            }
        }
        return;
    }
    int main()
    {
    
        cin>>n;
        dfs(1);
        return 0;
    }

     别怀疑代码的正确性:

    //把1-3的全排列分成三步
    //首先放第一张,然后第二,第三......
    void dfs(1)
    {
        int i;
        if(step==4)//为啥是4呢?因为我一共要打印1-3,肯定没有第四步
        {
            for(i=1; i<=3; i++)
            {
                cout<<a[i];
            }
            cout<<endl;
            return ;
        }
        for(i=1; i<=3; i++)
        {
            if(book[i]==0)//手中的牌
            {
                a[step]=i;//将i号扑克牌放入第step个盒子中
                book[i]=1;//将book[i]设置为1.表示i号牌不在手中。
                *******void dfs(2)
                {
                    int i;
                    if(step==4)
                    {
                        for(i=1; i<=3; i++)
                        {
                            cout<<a[i];
                        }
                        cout<<endl;
                        return ;
                    }
                    for(i=1; i<=3; i++)
                    {
                        if(book[i]==0)//手中的牌
                        {
                            a[step]=i;//将i号扑克牌放入第step个盒子中
                            book[i]=1;//将book[i]设置为1.表示i号牌不在手中。
                            *******void dfs(3)
                            {
                                int i;
                                if(step==4)
                                {
                                    for(i=1; i<=3; i++)
                                    {
                                        cout<<a[i];
                                    }
                                    cout<<endl;
                                    return ;
                                }
                                for(i=1; i<=3; i++)
                                {
                                    if(book[i]==0)//手中的牌
                                    {
                                        a[step]=i;//将i号扑克牌放入第step个盒子中
                                        book[i]=1;//将book[i]设置为1.表示i号牌不在手中。
                                        *******void dfs(4)
                                        {
                                            int i;
                                            if(step==4)
                                            {
                                                for(i=1; i<=3; i++)
                                                {
                                                    cout<<a[i];
                                                }
                                                cout<<endl;
                                                return ;
                                            }
                                            for(i=1; i<=3; i++)
                                            {
                                                if(book[i]==0)//手中的牌
                                                {
                                                    a[step]=i;//将i号扑克牌放入第step个盒子中
                                                    book[i]=1;//将book[i]设置为1.表示i号牌不在手中。
                                                    dfs(5);
                                                    book[i]=0;//将刚才的扑克牌收回,进行下一次尝试
                                                }
                                            }
                                            return;
                                        }
                                        book[i]=0;//将刚才的扑克牌收回,进行下一次尝试
                                    }
                                }
                                return;
                            }
                            book[i]=0;//将刚才的扑克牌收回,进行下一次尝试
                        }
                    }
                    return;
                }
    
                book[i]=0;//将刚才的扑克牌收回,进行下一次尝试
            }
        }
        return;
    }
  • 相关阅读:
    QT QQuickView嵌入到QT MDI中
    地理入门-经纬度时区速成总结篇(转)
    Linux下系统时间函数、DST等相关问题总结(转)
    camera接口---MIPI CSI-2接口、DVP接口和FPD-Link III LVDS、GMSL等接口对比(转)
    基于spi FLASH的嵌入式文件系统 littlefs(转)
    PID 温控系统 解决方法(转)
    单相计量芯片RN8209D使用经验分享(转)
    【开源】EasyFlash 新年发布 V4.0 beta 版,完全重写(转)
    在uboot中加入cmd_run命令,运行环境变量(转)
    MPU6050开发 -- 数据分析(转)
  • 原文地址:https://www.cnblogs.com/handsometaoa/p/11986123.html
Copyright © 2011-2022 走看看