回溯法,打标记

1.1.dfs实现排列树搜索(回溯模板)

def dfs(depth):
    if depth == n:
        print(path)
        return
    for i in range(1,n+1):
        if vis[i]:
            continue
        #打标记
        vis[i] = True
        path.append(i)
        dfs(depth+1)
        #清除标记
        vis[i] = False
        path.ppop(-1)
n = int(input())
path = []
vis = [False]*(n+1)
dfs(0)

1.2.求子集

#求子集
n = int(input())
a = list(map(int,input().split()))
path = []
def dfs(depth):
    if depth == n:
        print(path)
        return
    #选
    path.append(a[depth])
    dfs(depth+1)
    path.pop(-1)
    #不选
    dfs(depth+1)
dfs(0)

N皇后问题

在 N×N 的方格棋盘放置了 N 个皇后,使得它们不相互攻击(即任意 2 个皇后不允许处在同一排,同一列,也不允许处在与棋盘边框成 45 角的斜线上。你的任务是,对于给定的 N,求出有多少种合法的放置方法。

def dfs(x):
  if x == n+1:
    global ans
    ans += 1
    return
  for y in range(1,n+1):
    if vis1[y] or vis2[x+y] or vis3[x-y+n]:
      continue
    vis1[y] = vis2[x+y] = vis3[x-y+n] = True
    dfs(x+1)
    vis1[y] = vis2[x+y] = vis3[x-y+n] = False

n = int(input())
vis1 = [False]*(n+1)
vis2 = [False]*(2*n+1)
vis3 = [False]*(2*n+1)
ans = 0
dfs(1)
print(ans)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值