【DFS题型一/递归/数字全排序】递归实现枚举

94. 递归实现排列型枚举 - AcWing题库

n=int(input())
vis=[0]*n

a=[]
def dfs(x,fx,d,list1):
    global cnt
    if d>n:
        return
    if x==fx and d!=n:
        return
    if d==n and x==fx:
        cnt+=1
        a.append(list1)
        return
    for i in range(n):
        if vis[i]!=1 and x!=i:
            vis[x]=1
            dfs(i,fx,d+1,list1+[i+1])
            vis[x]=0
    return

sum=0
if n==1:#特殊情况不能忘
    print(1)
else:
    for i in range(n):
        for j in range(n):
            if i!=j:
                cnt=0
                dfs(i,j,1,[i+1])
                sum+=cnt
    a.sort()
    #print(sum)
    #print(a)
    for i in range(sum):
        print(*a[i])

简化版 

n=int(input())
vis=[0]*n

a=[]
def dfs(d,list1):
    if d>=n:
        print(*list1)
        return
    for i in range(n):
        if vis[i]!=1:
            vis[i]=1 #dfs未传入初值,初值在dfs内部第一层for循环输出,故取当前i为标记已走过
            dfs(d+1,list1+[i+1])
            vis[i]=0
    return
dfs(0,[])

93. 递归实现组合型枚举 - AcWing题库

n, m = map(int, input().split())
vis = [0] * n


def dfs(d, list1,x):
    if d >= m:
        print(*list1)
        return

    for i in range(x,n):
        if vis[i]!=1:
            vis[i] = 1 
            dfs(d + 1, list1 + [i + 1],i)
            vis[i] = 0


dfs(0,[],0)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值