Q:n 皇后问题研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击。
PS:皇后可以攻击同⼀⾏、同⼀列、左上左下右上右下四个⽅向的任意单位。
给定一个整数 n,返回所有不同的 n 皇后问题的解决方案。每一种解法包含一个明确的 n 皇后问题的棋子放置方案,该方案中 'Q' 和 '.' 分别代表了皇后和空位。
示例:
输入: 4
输出: [
[".Q..", // 解法 1
"...Q",
"Q...",
"..Q."],
["..Q.", // 解法 2
"Q...",
"...Q",
".Q.."]
]
解释: 4 皇后问题存在两个不同的解法。
A:回溯法
private List<List<String>> result = new ArrayList<>();
public List<List<String>> solveNQueens(int n) {
if (n == 0)
return result;
List<Integer> l = new ArrayList<>();
if (n == 1) {
List<String> l1 = new ArrayList<>();
l1.add("Q");
result.add(l1);
return result;
}
help(0, n, l);
return result;
}
private void help(int row, int n, List<Integer> l) {
if (row == n) {
List<String> strList = new ArrayList<>();
for(Integer num : l){
char[] t = new char[n];
Arrays.fill(t,'.');
t[num] = 'Q';
strList.add(new String(t));
}
result.add(strList);
return;
}
for (int col = 0; col < n; col++) {
if (!l.contains(col)) {
if (!isDiagonal(l, col)) {
l.add(col);
help(row + 1, n, l);
l.remove(l.size() - 1);
}
}
}
}
private boolean isDiagonal(List<Integer> currentQueen, int col) {
int currentRow = currentQueen.size();
for (int row = 0; row < currentQueen.size(); row++) {
//判断对角线
if (Math.abs(currentRow - row) == Math.abs(col - currentQueen.get(row))) {
return true;
}
}
return false;
}