深度优先搜索思想

深搜形象代表

深搜就是撞了南墙才会回头

见了黄河才会死心

它一条路走到黑

例如生成1---n全排列

#include <bits/stdc++.h>
using namespace std;
int n,mark[19]={0},num[19];
void dfs(int step)
{
    if(n+1==step)//搜索终止条件
    {
        for(int i=1;i<=n;i++)
            cout<<num[i];
        cout<<endl;
        return;
    }
    for(int i=1;i<=n;i++)//第一个数先从1开始,完了之后从2开始
    {
        if(!mark[i])
        {
            mark[i]=true;
            num[step]=i;//不能num[step++]=i;//要不然就会关系错乱
            dfs(step+1);//再搜索下一个数
            mark[i]=false;//回溯一步
        }
    }
    return;
}
int main()
{
    cin>>n;
    dfs(1);
}

当然,用队列做更简单

#include<bits/stdc++.h>
using namespace std;
int main()
{
    int n,p[10]={1,2,3,4,5,6,7,8};
    do
    {
        for(int i=0;i<5;i++)
        printf("%d ",p[i]);
        printf("\n");
    }while(next_permutation(p,p+5));//生成1-5全排列
    return 0;
}
//例如生成1-3全排列
#include<bits/stdc++.h>
using namespace std;
int main()
{
    int n,p[10]={1,2,3,4,5,6,7,8,9};
    do
    {
        for(int i=0;i<3;i++)
        printf("%d ",p[i]);
        printf("\n");
    }while(next_permutation(p,p+3));
    return 0;
}

再改编一下

如ABC+DEF=GHI形式

用1--9组成的不重复数字组成上述等式的方案个数是多少?

#include <bits/stdc++.h>
using namespace std;
int n,mark[19]= {0},num[19]={0},total=0;
void dfs(int step)
{
    if(10==step)
    {
        if (num[1] * 100 + num[2] * 10 + num[3]     //结束条件2,满足等式
                + num[4] * 100 + num[5] * 10 + num[6]
                == num[7]*100 + num[8]*10 + num[9])
        {
            total++;
        }
        return;
    }
    for(int i=1; i<=9; i++)
    {
        if(!mark[i])
        {
            mark[i]=true;
            num[step]=i;//不能num[step++]=i;
            dfs(step+1);
            mark[i]=false;
        }
    }
    return;
}
int main()
{
    //cin>>n;
    dfs(1);
    cout<<total/2;//因为A+B=B+A重复了一次
}

猜你喜欢

转载自blog.csdn.net/lanshan1111/article/details/81510244