n皇后问题

一道很典型的递归题目,来自Leetcode第51题
在这里插入图片描述
国际象棋里皇后可以攻击到横向和竖向以及斜线方向的对手。
现在给定一个n*n的棋盘,n个皇后,问如何摆放这n个皇后,使得所有皇后都攻击不到其他人?
题目要求输入输出格式如下:
Input: 4
Output: [
[".Q…", // Solution 1
“…Q”,
“Q…”,
“…Q.”],

["…Q.", // Solution 2
“Q…”,
“…Q”,
“.Q…”]
]

此题用有个用python代码简单易懂的方法。代码如下:

class Solution:
    def solveNQueens(self, n):
        def DFS(queens, xy_dif, xy_sum):
            p = len(queens) # p 是行的下标
            if p == n: # 当所有行都执行完了,意味着满足了所有条件,可以存储到result里等待输出。
                result.append(queens)
                return None
            for q in range(n): # q 是列的下标,每一行(p)都会尽可能遍历所有列,找到所有满足条件的列的位置
                # queens用来存储已经选择的列,比如,[0,2,4,1]意思是0、2、4、1这几个列已经被用掉了
                # xy_dif 是存储这样的斜对角 \ (从左上到右下)的线  因为所有的这样的斜对角的x,y之差都相同
                # xy_sum 是存储这样的斜对角 / (从右上到左下)的线  因为所有的这样的斜对角的x,y之和都相同
                if q not in queens and p - q not in xy_dif and p + q not in xy_sum:
                    DFS(queens + [q], xy_dif + [p - q], xy_sum + [p + q])

        result = []
        DFS([], [], [])
        return [["." * i + "Q" + "." * (n - i - 1) for i in sol] for sol in result]

博主也参考了C++和JAVA的代码,发现这个很容易理解,没有太多的函数跳转

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值