Q51 N皇后
n 皇后问题研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击。
上图为 8 皇后问题的一种解法。
给定一个整数 n,返回所有不同的 n 皇后问题的解决方案。
每一种解法包含一个明确的 n 皇后问题的棋子放置方案,该方案中 'Q'
和 '.'
分别代表了皇后和空位。
示例:
输入: 4
输出: [
[".Q..", // 解法 1
"...Q",
"Q...",
"..Q."],
["..Q.", // 解法 2
"Q...",
"...Q",
".Q.."]
]
解释: 4 皇后问题存在两个不同的解法。
class Solution {
List<List<String>> list = new ArrayList<>();
StringBuilder sb = new StringBuilder();
List<String> arrange = new ArrayList<>();
int[] record = null;
public List<List<String>> solveNQueens(int n) {
if (n < 1 || n == 2 || n == 3)
return list;
record = new int[n];
for (int i = 1; i < n; i++)
sb.append('.');
process(0);
return list;
}
private void process(int i) {
if (i == record.length) {
List<String> temp = new ArrayList<>();
temp.addAll(arrange);
list.add(temp);
return;
}
for (int j = 0; j < record.length; j++) {
if (isValid(record, i, j)) {
record[i] = j;
sb.insert(j, 'Q');
arrange.add(sb.toString());
sb.deleteCharAt(j);
process(i + 1);
arrange.remove(arrange.size() - 1);
}
}
}
private boolean isValid(int[] record, int i, int j) {
for (int k = 0; k < i; k++) {
if (record[k] == j || Math.abs(record[k] - j) == Math.abs(i - k))
return false;
}
return true;
}
}