递归实现排列型枚举

在这里插入图片描述
在这里插入图片描述
本题是一道递归的经典题目,初学者学习递归时可能觉得难以理解,我们可以手画递归搜索树将每种情况遍历出来,然后捋清思路后用代码来实现。
在这里插入图片描述
有图可知先从根节点开始遍历,当n为3时有3种情况,分别为1,2,3,然后看1的子树,后面两位未确定有两种可能性,左子树填2,剩下一位只能填3,其他遍历思想上同。接下来我们用代码来实现。

#include<bits/stdc++.h>

using namespace std;

const int N=10;
int n;
bool st[N];    //判断数是否被记录
int path[N];   //记录递归搜索树的路径内容

void dfs(int u)
{
    if(u>n)
    {
        for(int i=1;i<=n;i++)
        {
            cout<<path[i]<<" ";

        }  cout<<endl;

    }
    else
    {
        for(int i=1;i<=n;i++)
        {
            if(!st[i])    //当前这一位没有被用过的话
            {
                path[u]=i;        //将i填进去
                st[i]=true;       //标记i
                dfs(u+1);   //递归到下一层
                st[i]=false;      //恢复现场
                path[u]=0;
            }
        }
    }
}
int main()
{
    scanf("%d",&n);
    dfs(1);    //从1开始遍历
    return 0;
}

在这里插入图片描述
问题得到解决。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值