大家好,我是爱学习的小蓝,欢迎交流指正~
传送门: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
读码上万行,下键如有神,撸起袖子加油干!