leedcode 解题--- n皇后 (python)

题目

n 皇后问题研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击。
这里写图片描述
上图为 8 皇后问题的一种解法。
给定一个整数 n,返回所有不同的 n 皇后问题的解决方案。
每一种解法包含一个明确的 n 皇后问题的棋子放置方案,该方案中 ‘Q’ 和 ‘.’ 分别代表了皇后和空位。
示例:
输入: 4
输出: [
[“.Q..”, // 解法 1
“…Q”,
“Q…”,
“..Q.”],

[“..Q.”, // 解法 2
“Q…”,
“…Q”,
“.Q..”]
]
解释: 4 皇后问题存在两个不同的解法。

代码


class Solution:

    def solveNQueens(self, n):

        """

        :type n: int

        :rtype: List[List[str]]

        """ 

        res = []

        final_ans = []

        ans_list = [-1 for _ in range(n)]

        final_ans = list(self.queens(n, final_ans, ()))

        #final_ans里储存的是N皇后成功放置后的一个数字组成的元组,各个数字代表各行皇后所在的列数

        for each_ans in final_ans:

            final = []

            for index in each_ans:

                #构建最终答案,成为题目需要的形式



                row = '.'*index +'Q'*1 + '.'*(n-index-1)

                final += [row]

            res.append(final)

        return res









    def queens(self, num, final_ans, state = ()):  

        for pos in range(num):

            #pos指的是当前皇后应该放置的横坐标,也就是所在的列。

            if not self.conflict(state, pos):  

                #产生当前皇后的位置信息  

                #如果只剩一个皇后没有放置  

                if len(state) == num-1:  

                    yield (pos,)

                #否则,把当前皇后的位置信息,添加到状态列表里,并传递给下一皇后。  

                #程序要从前面的皇后得到包含位置信息的元组(元组不可更改)  

                #并要为后面的皇后提供当前皇后的每一种合法的位置信息  

                #所以把当前皇后的位置信息,添加到状态列表里,并传递给下一皇后。  

                else:  

                    for result in self.queens(num, final_ans, state+(pos,)):

                        yield (pos, ) + result





    def conflict(self, state, nextX):

        #nextY表示当前棋盘构造的长度,也就是下一个皇后应该落在的行的编号

        nextY = len(state)

        for i in range(nextY):

            #遍历之前的行,state[i]表示他们所在的列数,i表示他们所在的行数

            if abs(state[i]-nextX) in (0, nextY-i):

                return True

        return False
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值