深度优先算法-启示篇

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

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

比如打印好几个数的全排列:你可以选择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;
}
原文地址:https://www.cnblogs.com/handsometaoa/p/11986123.html