题目详述
n 皇后问题研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击。
给定一个整数 n,返回所有不同的 n 皇后问题的解决方案。
每一种解法包含一个明确的 n 皇后问题的棋子放置方案,该方案中 ‘Q’ 和 ‘.’ 分别代表了皇后和空位。
示例:
输入: 4
输出: [
[".Q…", // 解法 1
“…Q”,
“Q…”,
“…Q.”],
["…Q.", // 解法 2
“Q…”,
“…Q”,
“.Q…”]
]
分治法
class Solution {
List<List<String>> result = new ArrayList<>();
private int n;
// 之前皇后所能攻击到的位置
HashSet cols = new HashSet();
HashSet pie = new HashSet(); //撇
HashSet na = new HashSet(); // 捺
public List<List<String>> solveNQueens(int n) {
this.n = n;
recursive(new ArrayList<>(), 0);
return result;
}
private void recursive(List<String> currentQueen, int row) {
// recursive terminator(终止条件)
if (currentQueen.size() == n) {
result.add(new ArrayList<String>(currentQueen));
return;
}
// process courrent logic
// 遍历列(col),传入的参数是行(row)
for (int col = 0; col < n; col++) {
if (cols.contains(col) || pie.contains(row + col) || na.contains(n + row - col))
continue;// 能被攻击到就跳过本层循环
cols.add(col);
pie.add(row + col);
na.add(n + row - col);
// col是皇后对应列的位置,生成奇奇怪怪的格式,形如:[".Q..","...Q","Q...","..Q."]
StringBuilder cur =new StringBuilder("");
for(int i = 0; i < n; i++) {
if (i == col) cur.append("Q");
else cur = cur.append(".");
}
currentQueen.add(cur.toString());
// dill down(下探下一层)
recursive(currentQueen, row + 1);
// restore current status (清除老皇后和其势力痕迹)
cols.remove(col);
pie.remove(row + col);
na.remove(n + row - col);
currentQueen.remove(currentQueen.size() - 1);
}
}
}