LeetCode Python - 52. N 皇后 II


题目

n 皇后问题 研究的是如何将 n 个皇后放置在 n × n 的棋盘上,并且使皇后彼此之间不能相互攻击。

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

示例 1:

在这里插入图片描述

输入:n = 4
输出:2
解释:如上图所示,4 皇后问题存在两个不同的解法。

示例 2:

输入:n = 1
输出:1

提示:

  • 1 <= n <= 9

答案

设计一个函数 dfs(i),表示从第 i 行开始搜索,搜索到的结果累加到答案中。

在第 i 行,我们枚举第 i 行的每一列,如果当前列不与前面已经放置的皇后发生冲突,那么我们就可以放置一个皇后,然后继续搜索下一行,即调用 dfs(i+1)。

如果发生冲突,那么我们就跳过当前列,继续枚举下一列。

判断是否发生冲突,我们需要用三个数组分别记录每一列、每一条正对角线、每一条反对角线是否已经放置了皇后。

具体地,我们用 cols 数组记录每一列是否已经放置了皇后,用 dg 数组记录每一条正对角线是否已经放置了皇后,用 udg 数组记录每一条反对角线是否已经放置了皇后。

时间复杂度 O(n!),空间复杂度 O(n)。其中 n 是皇后的数量。

class Solution(object):
    def totalNQueens(self, n):
        """
        :type n: int
        :rtype: int
        """
        self.ans = 0

        def place(i, vert, ldiag, rdiag):
            if i == n: self.ans += 1
            else:
                for j in range(n):
                    vmask, lmask, rmask = 1 << j, 1 << (i+j), 1 << (n-i-1+j)
                    if vert & vmask or ldiag & lmask or rdiag & rmask: continue
                    place(i+1, vert | vmask, ldiag | lmask, rdiag | rmask)

        place(0,0,0,0)
        return self.ans

运行结果

在这里插入图片描述

  • 26
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

xuxu1116

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值