class Solution {
List<List<String>> res = new ArrayList<>();
LinkedList<String> path = new LinkedList<>();
HashSet<Integer> column = new HashSet<>();
HashSet<Integer> diagonal1 = new HashSet<>();
HashSet<Integer> diagonal2 = new HashSet<>();
public List<List<String>> solveNQueens(int n) {
backtracking(n,0);
return res;
}
public void backtracking(int n,int row){
if(row == n){
res.add(new ArrayList<>(path));
return;
}
StringBuffer sb = new StringBuffer();
for(int j = 0;j < n;j++){
if(!column.contains(j) && !diagonal1.contains(row + j) && !diagonal2.contains(row-j)){
column.add(j);
diagonal1.add(row + j);
diagonal2.add(row - j);
sb.append("Q");
for(int cur = j + 1;cur < n;cur++){
sb.append(".");
}
path.add(sb.toString());
backtracking(n,row + 1);
path.removeLast();
column.remove(j);
diagonal1.remove(row + j);
diagonal2.remove(row - j);
sb.delete(j,n);
sb.append(".");
} else {
sb.append(".");
}
}
}
}
用set来记录行,左斜线和右斜线是否已经有皇后了,set可以做到O(1)的查询,比遍历要快。
这个直接记录path比较麻烦,加入String后还要删除String,用了一种优化方法,直接用数组记录每一行皇后的坐标即可,在最后要添加组合时再转化成String List。
class Solution {
List<List<String>> res = new ArrayList<>();
HashSet<Integer> column = new HashSet<>();
HashSet<Integer> diagonal1 = new HashSet<>();
HashSet<Integer> diagonal2 = new HashSet<>();
int[] location;
public List<List<String>> solveNQueens(int n) {
location = new int[n];
backtracking(n,0);
return res;
}
public void backtracking(int n,int row){
if(row == n){
LinkedList<String> path = new LinkedList<>();
for(int i = 0; i < n;i++){
StringBuffer sb = new StringBuffer();
for(int j = 0; j < n;j++){
if(location[i] == j) sb.append("Q");
else sb.append(".");
}
path.add(sb.toString());
}
res.add(path);
return;
}
for(int j = 0;j < n;j++){
if(!column.contains(j) && !diagonal1.contains(row + j) && !diagonal2.contains(row-j)){
column.add(j);
diagonal1.add(row + j);
diagonal2.add(row - j);
location[row] = j;
backtracking(n,row + 1);
location[row] = 0;
column.remove(j);
diagonal1.remove(row + j);
diagonal2.remove(row - j);
}
}
}
}
还有用位运算来储存位置信息的,效率很高,mark一下。
class Solution {
public List<List<String>> solveNQueens(int n) {
int[] queens = new int[n];
Arrays.fill(queens, -1);
List<List<String>> solutions = new ArrayList<List<String>>();
solve(solutions, queens, n, 0, 0, 0, 0);
return solutions;
}
public void solve(List<List<String>> solutions, int[] queens, int n, int row, int columns, int diagonals1, int diagonals2) {
if (row == n) {
List<String> board = generateBoard(queens, n);
solutions.add(board);
} else {
int availablePositions = ((1 << n) - 1) & (~(columns | diagonals1 | diagonals2));
while (availablePositions != 0) {
int position = availablePositions & (-availablePositions);
availablePositions = availablePositions & (availablePositions - 1);
int column = Integer.bitCount(position - 1);
queens[row] = column;
solve(solutions, queens, n, row + 1, columns | position, (diagonals1 | position) << 1, (diagonals2 | position) >> 1);
queens[row] = -1;
}
}
}
public List<String> generateBoard(int[] queens, int n) {
List<String> board = new ArrayList<String>();
for (int i = 0; i < n; i++) {
char[] row = new char[n];
Arrays.fill(row, '.');
row[queens[i]] = 'Q';
board.add(new String(row));
}
return board;
}
}
作者:LeetCode-Solution
链接:https://leetcode-cn.com/problems/n-queens/solution/nhuang-hou-by-leetcode-solution/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。