【蓝桥刷题】——如何用递归实现排列组合?(DFS经典例题)

大家好,我是爱学习的小蓝,欢迎交流指正~ 


🔎题目

传送门:94. 递归实现排列型枚举 - AcWing题库

样例输入

3

样例输出

1 2 3
1 3 2
2 1 3
2 3 1
3 1 2
3 2 1

📖题解

难度系数:⭐

考察题型:搜索

涉及知识点:枚举DFS

小蓝的思路:

遇到没见过的题目没思路,不要紧,一开始从简单的代码敲起。

先按照题目的意思输入n,n=int(input())。

然后又看到样例输出里的数据,我就想:这么多数据肯定要找个地方存起来,

就自然创建了一个a数组,并且和下标一一对应,所以范围是(n+1)

题目明示是递归实现,自然创建了DFS函数,模板一套,稍微改几下就成了~


🍞代码

🍑递归排列枚举

n=int(input())#3
a,vis=[0]*(n+1),[0]*(n+1)
def dfs(x):
    if x>n:                      #如果越界
        for i in range(1,n+1):
            print(a[i],end=" ")
        print()
        return
    for i in range(1,n+1):       #循环枚举所有方案
        if vis[i]==0:            #未被标记
            vis[i]=1             #标记
            a[x]=i               #赋值
            dfs(x+1)             #递推
            vis[i]=0             #回溯
dfs(1)
'''
1 3 2 
2 1 3 
2 3 1 
3 1 2 
3 2 1 
'''

 🔎题目

传送门:93. 递归实现组合型枚举 - AcWing题库

样例输入

5 3

样例输出

1 2 3 
1 2 4 
1 2 5 
1 3 4 
1 3 5 
1 4 5 
2 3 4 
2 3 5 
2 4 5 
3 4 5 

📖题解

难度系数:⭐

考察题型:搜索

涉及知识点:DP

小蓝的思路:

老规矩,先输入m,n这两个数。

再创建a数组存放输出的答案。

定义DFS函数开始套模板:

越界条件,打印输出,结束搜索,循环遍历,数组赋值,递推回溯。

这几个步骤如果你的代码都有体现,那么DFS的骨架你就摸清啦~

🍎 递归组合枚举

m,n=map(int,input().split())# 3 2
a=[0]*(n+1)
def dfs(i,start):
    if i>n: #1>2 2>2 3>2     #越界
        for i in range(1,n+1):
            print(a[i],end=" ")
        print()
        return
    for num in range(start,m+1):#遍历
        a[i]=num                #赋值
        dfs(i+1,num+1)          #递推
        a[i]=0                  #回溯
dfs(1,1)
#[0,0,0]
#   1 2
#   1 3     
#   2 3

 读码上万行,下键如有神,撸起袖子加油干!

  • 26
    点赞
  • 46
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 14
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 14
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小蓝刷题

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值