持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第23天,点击查看活动详情
\
大家好,我是速冻鱼🐟,一条水系前端💦,喜欢花里胡哨💐,持续沙雕🌲,是隔壁寒草🌿的好兄弟,刚开始写文章。 如果喜欢我的文章,可以关注➕点赞,为我注入能量,与我一同成长吧~
题目🦀
51. N 皇后
难度困难
n 皇后问题 研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击。
给你一个整数 n ,返回所有不同的 n 皇后问题 的解决方案。
每一种解法包含一个不同的 n 皇后问题 的棋子放置方案,该方案中 'Q' 和 '.' 分别代表了皇后和空位。
示例 1:

输入:n = 4
输出:[[".Q..","...Q","Q...","..Q."],["..Q.","Q...","...Q",".Q.."]]
解释:如上图所示,4 皇后问题存在两个不同的解法。
示例 2:
输入:n = 1
输出:[["Q"]]
提示:
1 <= n <= 9
解题思路🌵
- 有出路、有死路。
- 考虑使用回溯算法。
解题步骤🌟
- 经典回溯套路
//初始化result path
const result = []
const path = []
// [1,2,3,4]
//循环
push
backtrac()
pop
//return
- 循环每一列是否能放置皇后
- 如果不能,继续下一列
- 如果可以,继续递归下一行查找
- 如果递归到了底层表示是一种解决方案,path收集它
源码🔥
/**
* @param {number} n
* @return {string[][]}
*/
var solveNQueens = function(n) {
const result = []
const path = []
function backtrack(row,path){
//到了棋盘的底部的下一层 path刚好收集满了 [1,3,0,2]
if(row===n){
return result.push(
path.map((item)=>{
const arr = new Array(n).fill('.')
arr[item]='Q'
return arr.join('')
})
)
}
for(let col=0;col<n;col++){
function canNotSet(){
return path.some((c,r)=>{
return (col===c) || (row===r) || (row-col===r-c) || (row+col===r+c)
})
}
const result=canNotSet()
//不能被设置
if(result){
continue
}
backtrack(row+1,[...path,col])
}
}
backtrack(0,path)
return result
};
时间复杂度:O(N!)
空间复杂度:O(N)
结束语🌞
那么鱼鱼的LeetCode算法篇的「leetCode」51-N皇后⚡️就结束了,虽然前端对算法要求没有后端高,但是算法是编程基础,程序=数据结构➕算法,所以算法这个东西没有捷径,只能多写多练,多总结,文章的目的其实很简单,就是督促自己去完成算法练习并总结和输出,菜不菜不重要,但是热爱🔥,喜欢大家能够喜欢我的短文,也希望通过文章认识更多志同道合的朋友,如果你也喜欢折腾,欢迎加我好友,一起沙雕,一起进步。
github🤖:sudongyu
个人博客👨💻:速冻鱼blog
vx👦:sudongyuer
写在最后
伙伴们,如果喜欢我的口水话给🐟🐟点一个赞👍或者关注➕都是对我最大的支持。