题目:
分析:
N皇后问题的本质是什么?
已占用的格子的行、列、对角线上都不能有棋子存在
每个格子之间的关系如下
行和列不重复是容易判断的,那么两个对角线该怎么判断呢?
蓝色的对角线上的格子有一个关系 : 行数+列数=常数
红色对角线上的格子也有一个关系 :行数-列数=常数
并且每个常数都不相同
对4皇后问题的一种解法作图:
上图可以较清楚的展示各个棋子之间的关系
那么这道题该怎么写呢?
我使用的是回溯法,以递归的形式,对每一个可能可以的格子进行遍历
代码:
class Solution {
private List<List<Integer>> list=new ArrayList<List<Integer>>();
public List<List<String>> solveNQueens(int n) {
StringBuilder strs=new StringBuilder();
List<List<String>> res=new ArrayList<List<String>>();
for(int i=0;i<n;i++){
strs.append('.');
}
String str=strs.toString();
HelpToSolveNQueens(n,new ArrayList<Integer>(),new ArrayList<Integer>(),new ArrayList<Integer>());
for(int i=0;i<list.size();i++){
List<String> temp=new ArrayList<String>();
for(int j=0;j<list.get(i).size();j++){
strs=new StringBuilder(str);
strs.replace(list.get(i).get(j)-1,list.get(i).get(j),"Q");
temp.add(strs.toString());
}
res.add(temp);
}
return res;
}
//递归函数
//queen用于存储每一行中皇后所在的列
//sum用于判断已有皇后的左对角线是否有重合
//diff用于判断已有皇后的右对角线是否有重合
public void HelpToSolveNQueens(int n,List<Integer> queen,List<Integer> sum,List<Integer> diff){
if(queen.size()==n){
list.add(new ArrayList<Integer>(queen));
return;
}
for(int i=1;i<=n;i++){
int temp_sum=queen.size()+i+1;
int temp_diff=queen.size()+1-i;
if((!queen.contains(i)) && (!sum.contains(temp_sum)) && (!diff.contains(temp_diff))){
queen.add(i);
sum.add(temp_sum);
diff.add(temp_diff);
HelpToSolveNQueens(n,queen,sum,diff);
queen.remove(queen.size()-1);
sum.remove(sum.size()-1);
diff.remove(diff.size()-1);
}
}
}
}
结果:
如果有什么疑问的话,可以在评论区里交流
来源:CSDN
作者:艾姆鸥
链接:https://blog.csdn.net/qq_39377543/article/details/104200948