52. N 皇后 II

题目-困难难度

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

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

示例 1:
在这里插入图片描述

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

示例 2:

输入:n = 1
输出:1

提示:

  • 1 <= n <= 9

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/summary-ranges
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

1. 回溯

class Solution:
    def totalNQueens(self, n: int) -> int:
        occupied = [set(), set(), set()]  # 分别存储已占用的列、正对角线、反对角线
        self.total_solutions = 0  # 解决方案总数

        def place_queen(row):
            if row == n:  # 如果已放置了 n 个皇后,则增加解决方案总数
                self.total_solutions += 1
            else:
                for col in range(n):  # 尝试在当前行的每一列放置皇后
                    if col in occupied[0] or (col - row) in occupied[1] or (col + row) in occupied[2]:  # 检查是否有冲突
                        continue
                    # 在当前位置放置皇后
                    occupied[0].add(col)
                    occupied[1].add(col - row)
                    occupied[2].add(col + row)
                    # 递归放置下一行的皇后
                    place_queen(row + 1)
                    # 回溯,移除当前位置的皇后
                    occupied[0].remove(col)
                    occupied[1].remove(col - row)
                    occupied[2].remove(col + row)

        place_queen(0)  # 从第 0 行开始放置皇后
        return self.total_solutions  # 返回解决方案总数

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值