【力扣】N皇后 |题号51,52 |经典 |回溯算法|

N皇后问题在力扣有两道题,这是经典的回溯算法问题。
n 皇后问题研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击。

52:N皇后

给定一个整数 n,返回 n 皇后不同的解决方案的数量。

算法:

class Solution:
    def totalNQueens(self, n: int) -> int:
        self.res=0
        def helper(n,ls=[]):
            if len(ls)==n:
                self.res+=1
                return
            for i in range(n):

                if ls:
                    for idx,j in enumerate(ls):
                        if i==j or abs(i-j)==len(ls)-idx:break
                    else:
                        helper(n,ls+[i])
                else:
                    helper(n, ls + [i])

        helper(n)
        return self.res

执行用时 :88 ms, 在所有 Python3 提交中击败了44.17%的用户
内存消耗 :13.6 MB, 在所有 Python3 提交中击败了20.00%的用户

51:N皇后

给定一个整数 n,返回所有不同的 n 皇后问题的解决方案。

每一种解法包含一个明确的 n 皇后问题的棋子放置方案,该方案中 ‘Q’ 和 ‘.’ 分别代表了皇后和空位。

算法:

直接在52的基础上做改进。

class Solution:
    def solveNQueens(self, n: int) -> List[List[str]]:
        res=[]
        def helper(n,ls=[]):
            if len(ls)==n:
                t=[]
                for i in ls:
                    t.append('.'*(i-0)+'Q'+'.'*(n-1-i))
                res.append(t)
                return
            for i in range(n):

                if ls:
                    for idx,j in enumerate(ls):
                        if i==j or abs(i-j)==len(ls)-idx:break
                    else:
                        helper(n,ls+[i])
                else:
                    helper(n, ls + [i])

        helper(n)
        return res
发布了317 篇原创文章 · 获赞 44 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/Heart_for_Ling/article/details/105657411