N皇后:回溯算法

解题思路

使用深度优先搜索,按行搜索。如果下一行搜索不到合法的路径,则相关参数回退到上一层,并尝试更新y之后再次搜索。
伪代码如下:

res=[] # 用于存储最终结果
def dfs(n,x,arr,cols,diag1,diag2):
    if x==n:
        res.append(arr)
    else:
        # 对于每一行x,循环搜索不同的列y值
        for y in range(n):
            if check(x,y)合法:
                # 更新合法性判断参数
                # 更新arr,cols,diag1,diag2等参数
                dfs(n,x+1,arr,cols,diag1,diag2)
                # 还原arr,cols,diag1,diag2等参数
            else:
                continue
dfs(n,0,[],set(),set(),set())

代码

class Solution(object):
    def solveNQueens(self, n):
        """
        :type n: int
        :rtype: List[List[str]]
        """
        # 全局变量res用于记录最终结果
        res=[]
        # n表示矩阵的边长,x表示当前搜索到的行,m表示当前已生成的矩阵
        # cols、diag1、diag2均用于判断矩阵的合法性,cols表示已经占据列,diag1、diag2用于表示已占据的左下斜边和右下斜边
        cols,diag1,diag2=set(),set(),set()
        def dfs(x,m,cols,diag1,diag2):
            # 搜索到第n行时表示搜索结束
            if x==n:
                res.append(m)
            else:
                # 对于任意一个x行,要搜索n列
                for y in range(n):
                    # 如果(x,y)合法,更新相关参数,继续搜索下一行
                    if (y not in cols) and (x+y not in diag1) and (x-y not in diag2):
                        cols.add(y)
                        diag1.add(x+y)
                        diag2.add(x-y)
                        m=m+[''.join(['Q' if i==y else '.' for i in range(n)])]
                        dfs(x+1,m,cols,diag1,diag2)
                        # 如果x+1层的搜索都不合法,参数需要进行还原,以便在对y进行循环时保持判别参数的有效性
                        cols.remove(y)
                        diag1.remove(x+y)
                        diag2.remove(x-y)
                        m=m[:-1]
                    # 如果(x,y)不合法,则continue,搜索下一列
                    else:
                        continue
        dfs(0,[],set(),set(),set())
        return res
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值