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)