|
| 1 | + |
| 2 | +>仰望星空的人,不应该被嘲笑 |
| 3 | + |
| 4 | +## 题目描述 |
| 5 | +n 皇后问题研究的是如何将 n 个皇后放置在 n×ばつn 的棋盘上,并且使皇后彼此之间不能相互攻击。 |
| 6 | + |
| 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 | + |
| 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 | + |
| 105 | + |
| 106 | +```javascript |
| 107 | +学如逆水行舟,不进则退 |
| 108 | +``` |
| 109 | + |
| 110 | + |
0 commit comments