题目链接(力扣)
#力扣: N 皇后
题目
n 皇后问题 研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击。
给你一个整数 n ,返回所有不同的 n 皇后问题 的解决方案。
每一种解法包含一个不同的 n 皇后问题 的棋子放置方案,该方案中 ‘Q’ 和 ‘.’ 分别代表了皇后和空位。
代码块
class Solution {
public List<List<String>> solveNQueens(int n) {
N=n;
queue=new char[n][n];
//初始化矩阵
initial(queue);
//回溯剪枝
backtrack(0);
//返回结果
return res;
}
char[][] queue;
int N;
List<String> path;
List<List<String>> res=new ArrayList<>();
//初始化矩阵
public void initial(char[][] queue){
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
queue[i][j]='.';
}
}
}
//回溯
public void backtrack(int row){
//边界
if(row==N) {
path = new ArrayList<>();
for (int i = 0; i < N; i++) {
StringBuilder sb = new StringBuilder();
for (int j = 0; j < N; j++) {
if (queue[i][j] == 'Q') {
sb.append("Q");
} else
sb.append(".");
}
path.add(sb.toString());
}
res.add(new ArrayList<>(path));
return;
}
//条件
for(int i=0;i<N;i++){//列
//判断
if(check(row,i)==true) {
queue[row][i]='Q';
backtrack(row+1);
queue[row][i]='.';
}
}
}
public boolean check(int row,int col){
//列
for (int i = 0; i <row ; i++) {
if(queue[i][col]=='Q'){
return false;
}
}
//斜线
// 检查 45度角是否有皇后
for (int i = row - 1, j = col - 1; i >=0 && j >= 0; i--, j--) {
if (queue[i][j] == 'Q') {
return false;
}
}
// 检查 135度角是否有皇后
for(int i = row - 1, j = col + 1; i >= 0 && j < N; i--, j++) {
if (queue[i][j] == 'Q') {
return false;
}
}
return true;
}
}