Recursion (backtracking).
在放置的时候,要保持当前的状态为合法,即当前放置位置的同一行、同一列、两条对角线上都不存在皇后。
用一个一位数组来存放当前皇后的状态
int A[N] stores the current solution on each row.
A[8] = {1, 3, 5, 7, …}
1 means the 1st queen is put on the 1st column of the 1st row.
3 means the 2nd queen is put on the 3rd column of the 2nd row.
class Solution {
public List<List<String>> solveNQueens(int n) {
List<List<String>> res = new ArrayList<>();
List<Integer> cur = new ArrayList<>();
solveNQueensHelper(n, cur, res);
return res;
}
private void solveNQueensHelper(int n, List<Integer> cur, List<List<String>> res) {
// base case: for all rows, we know where the queen is positioned
if (n == cur.size()) {
List<String> curQueen = putOnBoard(cur);
res.add(curQueen);
return;
}
for (int i = 0; i < n; i++) {
// check if putting a queen at column i at current row is valid
if (isValid(i, cur)) {
cur.add(i);
solveNQueensHelper(n, cur, res);
cur.remove(cur.size() - 1);
}
}
}
private boolean isValid(int col, List<Integer> cur) {
int row = cur.size();
for (int i = 0; i < row; i++) {
if (cur.get(i) == col || Math.abs(cur.get(i) - col) == row - i) {
return false;
}
}
return true;
}
private List<String> putOnBoard(List<Integer> cur) {
List<String> res = new ArrayList<>();
for (int i = 0; i < cur.size(); i++) {
StringBuilder sb = new StringBuilder();
int pos = cur.get(i);
for (int j = 0; j < pos; j++) {
sb.append(".");
}
sb.append("Q");
for (int j = pos + 1; j < cur.size(); j++) {
sb.append(".");
}
res.add(sb.toString());
}
return res;
}
}