n 皇后问题研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击。
上图为 8 皇后问题的一种解法。
给定一个整数 n,返回所有不同的 n 皇后问题的解决方案。
每一种解法包含一个明确的 n 皇后问题的棋子放置方案,该方案中 ‘Q’ 和 ‘.’ 分别代表了皇后和空位。
示例:
输入: 4
输出: [
[".Q…", // 解法 1
“…Q”,
“Q…”,
“…Q.”],
["…Q.", // 解法 2
“Q…”,
“…Q”,
“.Q…”]
]
解释: 4 皇后问题存在两个不同的解法。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/n-queens
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
class Solution {
public List<List<String>> solveNQueens(int n) {
// PS:皇后可以攻击同一行、同一列、左上左下右上右下四个方向的任意单位。
//棋盘的一排代表决策树上的一层 从第一层开始遍历,每次判断后进入下一层 -- for循环
/* 框架
函数() {
for(遍历数据 ,当前深度){
if(未被访问 && 条件符合){
加入路径
进入下一层(深度+1) 递归调用函数
回溯 该层
深度减一
}
}
}
*/
//建立数组
char [][] board = new char [n][n];
for(int i=0 ;i<n;i++){
for(int j=0 ;j<n;j++){
board[i][j]='.';
}
}
//建立深度
int deep =0;
//返回的结果集
List<List<String>> res = new LinkedList<>();
if (n <= 0) return null;
backtrack(res,board, 0);
return res;
}
//将一个路径转为String
public static List<String> charToString(char[][] array) {
List<String> result = new LinkedList<>();
for (char[] chars : array) {
result.add(String.valueOf(chars));
}
return result;
}
//框架函数
public void backtrack(List<List<String>> res,char[][] board,int deep){
//到达底层
if(deep==board.length){
//加入结果集
res.add(charToString(board));
return;
}
// row 代表排 与深度一样
for(int i=0 ; i<board.length;i++){
if (!isValid(board, deep, i)) continue;
//置位Q
board[deep][i]='Q';
//下一步操作
deep++;
backtrack(res,board,deep);
//回溯
deep--;
board[deep][i]='.';
}
}
//判断能否摆放函数 row 排 column 列
public boolean isValid(char [][] board ,int row ,int column){
//1.是否同一列
for(int i=0 ; i<board.length;i++){
if(board[i][column]=='Q'){
return false;
}
}
//2.是否左上
for(int i=row-1,j=column-1;i>=0&&j>=0 ; i--,j--){
if(board[i][j]=='Q'){
return false;
}
}
//3.是否右上
for(int i = row -1,j=column+1;i>=0&&j<board.length;i--,j++){
if(board[i][j]=='Q'){
return false;
}
}
return true;
}
}