class Solution {
Set<Integer> lie = new HashSet<>();
Set<Integer> pie = new HashSet<>();
Set<Integer> na = new HashSet<>();
List<List<Integer>> result = new ArrayList<>();
public List<List<String>> solveNQueens(int n) {
List<Integer> curr = new ArrayList<>();
dfs(0, curr, n);
return get_pic(result, n);
}
// 通过列丿捺的集合判别是否可以落子
public void dfs(int i, List<Integer> currCopy, int n) {
List<Integer> curr = new ArrayList<>(currCopy);
if (i >= n) {
result.add(curr);
return;
}
for (int j = 0; j < n; j++) {
if (lie.contains(j) || pie.contains(i+j) || na.contains(i-j))
continue;
lie.add(j);
pie.add(i + j);
na.add(i - j);
List<Integer> currTemp = new ArrayList<>(curr);
currTemp.add(j);
dfs(i + 1, currTemp, n);
lie.remove(j);
pie.remove(i + j);
na.remove(i - j);
}
}
// 把得到的结果以String的形式打印出来
public List<List<String>> get_pic(List<List<Integer>> result, int n) {
List<List<String>> resList = new ArrayList<>();
for (int i = 0; i < result.size(); i++) {
List<String> res = new ArrayList<>();
for(int j = 0; j < n; j++) {
Integer k= result.get(i).get(j);
String temp = String.join("", Collections.nCopies(k, "."));
temp += "Q";
temp += String.join("", Collections.nCopies(n - k -1, "."));
res.add(temp);
}
resList.add(res);
}
return resList;
}
}
注:
1. 思路比较简单,就是判断是不是在列撇捺的集合里面,不在就满足条件
2. 这个是改写的别人的python的版本,但是涉计到list的copy问题还是string的"."的打印,用java会比较麻烦。效率比较低,胜在好理解。