Skip to content

Commit 94b1259

Browse files
committed
add LeetCode 51. N 皇后
1 parent e7db25c commit 94b1259

File tree

1 file changed

+110
-0
lines changed

1 file changed

+110
-0
lines changed
+110
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,110 @@
1+
![](https://imgconvert.csdnimg.cn/aHR0cHM6Ly9jZG4uanNkZWxpdnIubmV0L2doL2Nob2NvbGF0ZTE5OTkvY2RuL2ltZy8yMDIwMDgyODE0NTUyMS5qcGc?x-oss-process=image/format,png)
2+
>仰望星空的人,不应该被嘲笑
3+
4+
## 题目描述
5+
n 皇后问题研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击。
6+
![](https://img-blog.csdnimg.cn/2020091821462735.png#pic_center)
7+
8+
上图为 8 皇后问题的一种解法。
9+
10+
给定一个整数 n,返回所有不同的 n 皇后问题的解决方案。
11+
12+
每一种解法包含一个明确的 n 皇后问题的棋子放置方案,该方案中 'Q' 和 '.' 分别代表了皇后和空位。
13+
14+
15+
16+
示例:
17+
18+
```javascript
19+
输入:4
20+
输出:[
21+
[".Q..", // 解法 1
22+
"...Q",
23+
"Q...",
24+
"..Q."],
25+
26+
["..Q.", // 解法 2
27+
"Q...",
28+
"...Q",
29+
".Q.."]
30+
]
31+
解释: 4 皇后问题存在两个不同的解法。
32+
```
33+
34+
35+
36+
提示:
37+
38+
```javascript
39+
皇后彼此不能相互攻击,也就是说:任何两个皇后都不能处于同一条横行、纵行或斜线上。
40+
```
41+
42+
来源:力扣(LeetCode)
43+
链接:https://leetcode-cn.com/problems/n-queens
44+
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
45+
46+
47+
## 解题思路
48+
对于 n 皇后问题,经典的回溯算法,我们采用一行放一个,然后逐行来放,这样我们就不用在剪枝的时候判断是否同行了。只需要判断是否同列 或者 同一斜线就好了。
49+
![](https://img-blog.csdnimg.cn/20200918225658496.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MjQyOTcxOA==,size_16,color_FFFFFF,t_70#pic_center)
50+
<a href="https://leetcode-cn.com/problems/n-queens/solution/shou-hua-tu-jie-cong-jing-dian-de-nhuang-hou-wen-t/">参考xiao_ben_zhu大佬图解</a>
51+
52+
53+
54+
```javascript
55+
var solveNQueens = function(n) {
56+
let res = [];
57+
let grid = new Array(n); // 初始化一个地图
58+
for(let i=0;i<n;i++){
59+
grid[i] = new Array(n).fill('.');
60+
}
61+
// 剪枝条件
62+
let check = (x,y)=>{
63+
for(let i=0;i<x;i++){
64+
for(let j=0;j<n;j++){
65+
// 判断同列 或者 同一斜线即可(不需要判断同行是因为一行一行放的,一定不同行)
66+
if(grid[i][j] == 'Q' && (j == y || i+j == x+y || i-j == x-y) ){
67+
return true;
68+
}
69+
}
70+
}
71+
return false;
72+
}
73+
let dfs = (t) => {
74+
if(t === n ){
75+
let ans = grid.slice(); // 拷贝一份,对输出做处理
76+
for(let i=0;i<n;i++){
77+
ans[i] = ans[i].join('');
78+
}
79+
res.push(ans);
80+
return;
81+
}
82+
for(let i=0;i<n;i++){
83+
if(check(t,i)) continue;
84+
grid[t][i] = 'Q';
85+
dfs(t+1);
86+
grid[t][i] = '.';
87+
}
88+
}
89+
dfs(0);
90+
return res;
91+
};
92+
```
93+
94+
95+
## 最后
96+
文章产出不易,还望各位小伙伴们支持一波!
97+
98+
往期精选:
99+
100+
<a href="https://github.com/Chocolate1999/Front-end-learning-to-organize-notes">小狮子前端の笔记仓库</a>
101+
102+
<a href="https://yangchaoyi.vip/">访问超逸の博客</a>,方便小伙伴阅读玩耍~
103+
104+
![](https://img-blog.csdnimg.cn/2020090211491121.png#pic_center)
105+
106+
```javascript
107+
学如逆水行舟,不进则退
108+
```
109+
110+

0 commit comments

Comments
 (0)