不剪枝要走多少个结点
把 1 到 5 排成一排,要求挨着的两个不能是连号。这个版本先把 5 个位置全排满,最后才检查。运行它,看走过了多少个结点:
def naive(n):
st = {"c": 0, "v": 0}
path = []
used = [False] * (n + 1)
def dfs():
st["v"] += 1
if len(path) == n:
for i in range(n - 1):
if abs(path[i] - path[i + 1]) == 1:
return
st["c"] += 1
return
for x in range(1, n + 1):
if used[x]:
continue
used[x] = True
path.append(x)
dfs()
path.pop()
used[x] = False
dfs()
return st["c"], st["v"]
print(naive(5)[1])
全部评论