N皇后
来源:力扣(Leetcode)
链接:https://leetcode-cn.com/problems/n-queens/
问题叙述
n 皇后问题 研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击。
给你一个整数 n ,返回所有不同的 n 皇后问题 的解决方案。
每一种解法包含一个不同的 n 皇后问题 的棋子放置方案,该方案中 ‘Q’ 和 ‘.’ 分别代表了皇后和空位。
示例 1
输入
n = 4
输出
[[“.Q…”,“…Q”,“Q…”,“…Q.”],[“…Q.”,“Q…”,“…Q”,“.Q…”]]
解释
如上图所示,4 皇后问题存在两个不同的解法。
示例 2
输入
n = 1
输出
[[“Q”]]
分析
一层一层的暴搜,遍历每个格子的时候,需要判断本行本列和两条对角线上没有别的Queen,但由于我们是一层一层遍历的,所以不需要当前行的下方,所以我们只需要判断一下上方,左上方和右上方是否存在别的Queen,如果存在的话,就直接跳过本次操作
Code
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45
| class Solution { int n; char[][] map; List<List<String>> res = new ArrayList<>();
public List<List<String>> solveNQueens(int _n) { n = _n; map = new char[n][n]; for (char[] c : map) Arrays.fill(c, '.'); dfs(0); return res; }
void dfs(int row) { if (row == n) { List<String> list = new ArrayList<>(); for (char[] c : map) list.add(new String(c)); res.add(list); } for (int col = 0; col < n; col++) { if (judge(row, col)) continue; map[row][col] = 'Q'; dfs(row + 1); map[row][col] = '.'; } }
boolean judge(int row, int col) { for (int i = 0; i < row; i++) if (map[i][col] == 'Q') return true; for (int i = row - 1, j = col - 1; i >= 0 && j >= 0; i--, j--) if (map[i][j] == 'Q') return true; for (int i = row - 1, j = col + 1; i >= 0 && j <= n - 1; i--, j++) if (map[i][j] == 'Q') return true; return false; } }
|
N皇后II
来源:力扣(Leetcode)
链接:https://leetcode-cn.com/problems/n-queens-ii/
问题叙述
n 皇后问题 研究的是如何将 n 个皇后放置在 n × n 的棋盘上,并且使皇后彼此之间不能相互攻击。
给你一个整数 n ,返回 n 皇后问题 不同的解决方案的数量。
示例 1
输入
n = 4
输出
2
解释
如上图所示,4 皇后问题存在两个不同的解法。
示例 2
输入
n = 1
输出
1
分析
不需要具体的方案,只要一个方案数,最简单的方法就是把刚刚的代码的返回值改成res.size()
Code
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41
| class Solution { int n; char[][] map; int res = 0;
public int totalNQueens(int _n) { n = _n; map = new char[n][n]; for (char[] c : map) Arrays.fill(c, '.'); dfs(0); return res; }
void dfs(int row) { if (row == n) res++; for (int col = 0; col < n; col++) { if (judge(row, col)) continue; map[row][col] = 'Q'; dfs(row + 1); map[row][col] = '.'; } }
boolean judge(int row, int col) { for (int i = 0; i < row; i++) if (map[i][col] == 'Q') return true; for (int i = row - 1, j = col - 1; i >= 0 && j >= 0; i--, j--) if (map[i][j] == 'Q') return true; for (int i = row - 1, j = col + 1; i >= 0 && j <= n - 1; i--, j++) if (map[i][j] == 'Q') return true; return false; } }
|