【经典算法】n皇后问题(暴搜枚举剪枝)

这篇博客探讨了n皇后问题,它是经典的回溯算法应用。内容涉及到将n个皇后放置在n×n棋盘上,使得皇后彼此不攻击。文章通过分析leetcode 51题,介绍了全排列问题的衍生,并提供了核心代码,讨论了时间复杂度和空间复杂度。
摘要由CSDN通过智能技术生成

n皇后问题也属于经典的回溯算法

leetcode 51. N皇后

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

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

全排列问题的衍生

n皇后问题是n*n的棋盘上,放n个皇后,使得每行,每列,每条主对角线和副对角线不能有两个皇后。
我们可以看成全排列问题,即用例如123表示每行的放法,第1行第1列放一个皇后,第2行第3列放一个皇后,第3行第3列放一个皇后。
我们每次枚举看该行可以再哪一列放皇后(即剪枝)。
时间复杂度O(N!) , 空间复杂度O(N),记录列,主对角线和副对角线是否可以放

核心代码

class Solution {
   
public:
    int n;
    vector<vector<string>> ans;
    vector
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值