n 皇后问题研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击。
上图为 8 皇后问题的一种解法。
给定一个整数 n,返回所有不同的 n 皇后问题的解决方案。
每一种解法包含一个明确的 n 皇后问题的棋子放置方案,该方案中 ‘Q’ 和 ‘.’ 分别代表了皇后和空位。
示例:
输入: 4
输出: [
[".Q…", // 解法 1
“…Q”,
“Q…”,
“…Q.”],
["…Q.", // 解法 2
“Q…”,
“…Q”,
“.Q…”]
]
一行一行地落子,每一行都只能落一个字,然后尝试在0~n-1地每一个位置都落子; 如果能够落子,那么 考虑下一行,如果不能就gg
class Solution {
List<List<String>> res=new LinkedList<>();
public List<List<String>> solveNQueens(int n) {
List<String> list=new LinkedList<>();
int[]pos_record=new int[n];
set_cur(n,0,-2,list,pos_record);
return res;
}
//这样比较耗空间,list可以在row==n-1时,根据 pos_record来添加进去
void set_cur(int n,int row,int pre_pos,List<String> list,int[] pos_record){
//先看一下这个位置能不能落子,在位置i落子
for(int i=0;i<n;i++){
if(is_addable(pos_record,row,i)){
List<String> new_list=new LinkedList<>(list);
int[] new_pos_record=new int[n];
for(int k=0;k<n;k++){
new_pos_record[k]=pos_record[k];
}
//那么这里是可以落子的
String s="";
for(int j=0;j<n;j++){
if(j==i){
s+="Q";
}
else {
s+=".";
}
}
// System.out.print(s+"\n");
new_list.add(s);
if(row== n-1){
//如果已经是最后一行
res.add(new_list);
// System.out.print("im");
}
else {
new_pos_record[row]=i;//第row行落子到位置i上
set_cur(n,row+1,i,new_list,new_pos_record);
}
}
}
}
boolean is_addable(int []record,int row,int pos){
for(int i=0;i<row;i++){
//什么情况下不能落子?
if(record[i]==pos||Math.abs(pos-record[i])==Math.abs(row-i)){
return false;
}
}
return true;
}
}