在包含问题的所有解的解空间树中,按照深度优先搜索的策略,从根结点出发深度探索解空间树。当探索到某一结点时,要先判断该结点是否包含问题的解,如果包含,就从该结点出发继续探索下去,如果该结点不包含问题的解,则逐层向其祖先结点回溯。(其实回溯法就是对隐式图的深度优先搜索算法)。
若用回溯法求问题的所有解时,要回溯到根,且根结点的所有可行的子树都要已被搜索遍才结束。
而若使用回溯法求任一个解时,只要搜索到问题的一个解就可以结束
[1] n后问题
在n×n的棋盘上放置彼此不受攻击的n个皇后。按照国际象棋的规则,皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子。
"""
- 回溯法
- n皇后问题
- https://labuladong.gitbook.io/algo/di-ling-zhang-bi-du-xi-lie/hui-su-suan-fa-xiang-jie-xiu-ding-ban
"""
def place(x, k):
for i in range(1, k):
# 判断i, k 是否在对角线、水平、垂直方向上存在其他皇后
if x[i] == x[k] or abs(x[i] - x[k]) == abs(i - k):
return False
return True
def queens(n):
x = [0 for row in range(n + 1)]
sum, k = 0, 1
while k > 0:
x[k] += 1
# 不是边界和没有在对角线上
while (x[k] <= n) and (not place(x, k)):
x[k] += 1
if x[k] <= n:
if k == n:
sum += 1
print(sum, x[1:])
else:
k = k + 1
x[k] = 0
else:
x[k] = 0
k -= 1
return x[1:]
if __name__ == '__main__':
queens(10)