回溯法

171 阅读1分钟

在包含问题的所有解的解空间树中,按照深度优先搜索的策略,从根结点出发深度探索解空间树。当探索到某一结点时,要先判断该结点是否包含问题的解,如果包含,就从该结点出发继续探索下去,如果该结点不包含问题的解,则逐层向其祖先结点回溯。(其实回溯法就是对隐式图的深度优先搜索算法)。

​ 若用回溯法求问题的所有解时,要回溯到根,且根结点的所有可行的子树都要已被搜索遍才结束。

​ 而若使用回溯法求任一个解时,只要搜索到问题的一个解就可以结束

[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)