回溯是dfs的一种,回溯强调此路不通,另寻他路,走过的路打标记
回溯模板:
例题1:排列数
答案:
def dfs(depth):
#depth:第depth个数字
if depth == n:
print(path)
return
#第depth个数字可以从1-n进行选择
for i in range(1,n+1):
#选择的数字必须未标记
if vis[i]:
continue
#做出选择则打标记
vis[i] = True
#记录路径
path.append(i)
dfs(depth + 1)
vis[i] = False
path.pop()
n = int(input())
vis = [False] * (n+1)
path = []
dfs(0)
例题2:N皇后
答案:
def dfs(x):
#第x层的皇后
if x == n + 1:
global ans
ans += 1
return
#第x层的皇后枚举每一列
for y in range(1,n + 1):
#当前的坐标为(x,y),要求当前列、当前主对角线、副对角线不能被攻击到
if vis1[y] or vis2[x + y] or vis3[x - y + n]:
continue
#此时(x,y)是合法点
#打标记,进入下一层搜索、回到该层、清空标记
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)
dfs好难,我还是先放一放