回溯困难 LeetCode51. N 皇后
描述
n 皇后问题 研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击。
给你一个整数 n ,返回所有不同的 n 皇后问题 的解决方案。
每一种解法包含一个不同的 n 皇后问题 的棋子放置方案,该方案中 ‘Q’ 和 ‘.’ 分别代表了皇后和空位。
分析
回溯的解法也可以理解为,回溯穷尽了所有n个皇后的放置位置可能结果,对不可能的位置做剪枝。
-
整个n*n大小的皇后可选位置用n*n的二维字符数组表示,数组方便后面判断可不可以放置"Q"。 递归n层,若当前的层数是n,说明已经递归了n层,要结束了。 每一层都要遍历n个位置,判断可不可以是"Q"
class Solution {
List<String> li = new ArrayList<>();
List<List<String>> res = new ArrayList<>();
public List<List<String>> solveNQueens(int n) {
char[][] queen = new char[n][n];
backTracking(n,0,queen);
return res;
}
public void backTracking(int n, int row, char[][] queen){
if(row == n){
res.add(new ArrayList<String>(li));
return ;
}
for(int i = 0; i < n; i++){
if(!isAvalible(queen,row,i)){
continue;
}
queen[row][i] = Q;
String str = "";
for(int j = 0; j < n; j++){
if(queen[row][j] != Q){
str+=.;
}else{
str+=Q;
}
}
li.add(str);
backTracking(n,row+1,queen);
queen[row][i] = .;
li.remove(li.size()-1);
}
}
public boolean isAvalible(char[][] queen, int row, int col){
for(int i = 0; i < row; i++){
if(queen[i][col] == Q){
return false;
}
}
for(int i = row, j = col; i >= 0 && j < queen.length; i--,j++){
if(queen[i][j] == Q){
return false;
}
}
for(int i = row, j = col; i >= 0 && j >= 0; i--,j--){
if(queen[i][j] == Q){
return false;
}
}
return true;
}
}
