DFS排列组合

初学,加强一下理解

#include<iostream>
using namespace std;
int n,r,a[100],b[100];

/* 每次dfs都是从1到n中
   选出一个数放在排列中第x个位置
*/
void dfs(int x)
{
    if(x==r+1)   //截止条件,只需要放r个数,当递归到第r+1时,则停止,并输出已经排好的r个数
    {
        for(int i=1;i<=r-1;i++)
            cout<<a[i]<<" ";
            cout<<a[r];
        cout<<endl;
        return;
    }
    for(int i=1;i<=n;i++)
    {
        if(b[i]==0&&i>a[x-1])    //  第i个数是可用的,且保证不再重复
        {
            a[x]=i;    //  将这个数放到x这个位置
            b[i]=1;    //  则这个数不能再使用了
            dfs(x+1);  //  往排列的下一个位置
            b[i]=0;    //  比如在三个数中选三个数做排列
            /*
               则刚开始,dfs(1)在i=1时进入dfs(2),dfs(2)在i=2时进入dfs(3),
               dfs(3)在i=3时进入dfs(4)则可以输出一次结果,dfs(4)结束,
               此时回到dfs(3),则b[3]=0,表明第三个数是可用的
               而此时for循环也到了3,则dfs(3)结束,
               回到dfs(2)中进入dfs(3)的地方,此时i=2,则b[2]=0,表明第二个数也可用
               此时dfs(2)则表明还在尝试第二个位置能不能放其他的数,
               for循环继续,i为3,发现第三个数可用,则放上第三个数,进入dfs(3),发现第二个数可用,放上
               进入dfs(4),则输出另一个结果
            */
        }
    }
}
int main(void)
{
    cin>>n>>r;
    for(int i=1;i<=n;i++)
    {
        b[i]=0;
    }
    for(int i=1;i<=r;i++)
    {
        a[i]=0;  //放排列数
    }
    dfs(1);
}
发布了20 篇原创文章 · 获赞 3 · 访问量 5423

猜你喜欢

转载自blog.csdn.net/treble_csnd/article/details/104435295