思路:
使用回溯遍历每一种情况。
使用二维数组map记录当前已经摆放了棋子的位置。
在每一行尝试放在每一列,检查这个位置是否可以放,如果可以就继续向下遍历,否则跳过,
当可以遍历到最后一行后,将path加入答案。
总结:
检查当前位置的上方,左上和右上是否存在棋子,从而判断当前位置是否可以放置棋子。
代码:
class Solution {
private List<List<String>> ans = new ArrayList<>();
private List<String> path = new ArrayList<>();
private boolean[][] map;
private StringBuilder sb;
public List<List<String>> solveNQueens(int n) {
map = new boolean[n][n];
sb = new StringBuilder();
for(int i = 0; i < n; i++) {
sb.append(".");
}
backtracing(0, n);
return ans;
}
private void backtracing(int t, int n) {
if(t == n) {
ans.add(new ArrayList<>(path));
return;
}
StringBuilder temp = new StringBuilder(sb);
for(int i = 0; i < n; i++) {
if(check(t, i, n)) {
//System.out.println(t + ":" + i);
temp.setCharAt(i, 'Q');
map[t][i] = true;
path.add(temp.toString());
backtracing(t + 1, n);
path.remove(path.size() - 1);
map[t][i] = false;
temp.setCharAt(i, '.');
}
}
return;
}
private boolean check(int t, int i, int n) {
for(int j = 0; j < t; j++) {
if(map[j][i]) return false;
}
for(int j = t, k = i; j >= 0 && k < n; j--, k++) {
if(map[j][k]) return false;
}
for(int j = t, k = i; j >= 0 && k >= 0; j--, k--) {
if(map[j][k]) return false;
}
return true;
}
}