一、题目
1、题目介绍
n 皇后问题研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击。
上图为 8 皇后问题的一种解法。
给定一个整数 n,返回 n 皇后不同的解决方案的数量。
示例:
输入: 4
输出: 2
解释: 4 皇后问题存在如下两个不同的解法。
[
[“.Q…”, // 解法 1
“…Q”,
“Q…”,
“…Q.”],
[“…Q.”, // 解法 2
“Q…”,
“…Q”,
“.Q…”]
]
2、题目分析
分析都在源代码里
3、本题源代码
class Solution {
private int number=0;
public int totalNQueens(int n) {
char[][] board=new char[n][n];
backtrack(board,n,0);
return number;
}
public void backtrack(char[][] board,int n,int row)
{
/**【1】递归的结束条件*/
if(row==n) {//如果当前的行等于棋盘的行数,就成功返回,并number+1
number++;
return;
}
/**一列一列地判断*/
for(int i=0;i<n;i++){
if(isPlace(n,board,row,i)) {
/**【2】做出选择*/
board[row][i] = 'Q';//没冲突可以添加皇后
/**【3】递归*/
backtrack(board, n, row + 1);//继续下一行添加皇后
/**【4】撤销*/
board[row][i] = '.';//撤销到上一步状态,继续寻找其它位置
}
}
}
/**判断是否可以添加皇后的函数*/
public boolean isPlace(int n,char [][] board,int row,int col){//row,col表示当前皇后添加的行与列
//判断是否有冲突列
for(int i=0;i<row;i++) {
if(board[i][col]=='Q')
return false;
}
//判断正方向对角线是否有冲突、
for(int i=row-1,j=col-1;i>=0&&j>=0;j--,i--){
if(board[i][j]=='Q')
return false;
}
//判断反方向对角线是否有冲突
for(int i=row-1,j=col+1;i>=0&&j<n;i--,j++) {
if (board[i][j] == 'Q')
return false;
}
return true;
}
}
4、以N=3为例,详细的执行树型图解
总结!
继续加油!