题目
The n-queens puzzle is the problem of placing n queens on an n×n chessboard such that no two queens attack each other.
Given an integer n, return all distinct solutions to the n-queens puzzle.
Each solution contains a distinct board configuration of the n-queens’ placement, where ‘Q’ and ‘.’ both indicate a queen and an empty space respectively.
For example,
There exist two distinct solutions to the 4-queens puzzle:
[
[“.Q..”, // Solution 1
“…Q”,
“Q…”,
“..Q.”],
[“..Q.”, // Solution 2
“Q…”,
“…Q”,
“.Q..”]
]
分析
递归?或者叫回溯
就是不断的试啊,有条件不符合的就返回
class Solution {
public static List<List<String>> solveNQueens(int n) {
List<List<String>> ret = new LinkedList<>();
boolean[] used = new boolean[n];
LinkedList<String> list = new LinkedList<>();
HashSet<Integer> diff = new HashSet<>(2*n-1);
HashSet<Integer> sum = new HashSet<>(2*n-1);
calculate(ret, list, n, used, -65535, diff, sum);
return ret;
}
public static void calculate(List<List<String>> ret, List<String> list, int n, boolean[] used,
int lastIndex, HashSet diff, HashSet sum) {
if (list.size() == n) {
ret.add(list);
}
for (int i = 0; i<n;i++) {
if (!used[i] && i!=lastIndex-1 && i!=lastIndex+1&&!diff.contains(list.size()-i) && !sum.contains(list.size()+i)) {
LinkedList<String> listtmp = new LinkedList<>();
listtmp.addAll(list);
used[i] = true;
diff.add(list.size() - i);
sum.add(list.size()+i);
StringBuffer str = new StringBuffer("");
for (int j = 0; j<n;j++) {
if (j == i) {
str.append("Q");
} else {
str.append(".");
}
}
listtmp.add(str.toString());
calculate(ret, listtmp, n, used,i,diff, sum);
used[i] = false;
diff.remove(list.size()-i);
sum.remove(list.size()+i);
}
}
}
}