51. N 皇后
题目:n 皇后问题研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击。

上图为 8 皇后问题的一种解法。
给定一个整数 n,返回所有不同的 n 皇后问题的解决方案。
每一种解法包含一个明确的 n 皇后问题的棋子放置方案,该方案中 'Q' 和 '.' 分别代表了皇后和空位。
代码://求解集很明显是用回溯法,但效率太低了 第二种方法利用二维数组来做
class Solution {
public List<List<String>> solveNQueens(int n) {
var arraylist=new ArrayList<String>(n);
var list=new ArrayList<List<String>>();
char[] ch=new char[n];
Arrays.fill(ch,'.');
StringBuilder str=new StringBuilder();
str.append(ch);
backTrack(list,arraylist,1,n,str);
return list;
}
//回溯法,递归循环查找解集
public static void backTrack(List<List<String>> list,List<String> arraylist,int t,int n,StringBuilder str){
if(t>n){
list.add(new ArrayList<String>(arraylist));
return;
}
for(int i=0;i<n;i++){
str.setCharAt(i,'Q');
arraylist.add(str.toString());
if(isOk(arraylist)){
str.setCharAt(i,'.');
backTrack(list,arraylist,t+1,n,str);} //String是引用传递
arraylist.remove(arraylist.size()-1);
str.setCharAt(i,'.');
}
}
public static boolean isOk(List<String> arraylist){
if(arraylist.size()==0){return true;}
int[] index=new int[arraylist.size()];
index[arraylist.size()-1]=arraylist.get(arraylist.size()-1).indexOf('Q');
//arr数组存放每行皇后的位置i为行,arr[i]为列数
for(int i=0;i<arraylist.size()-1;i++){
index[i]=arraylist.get(i).indexOf('Q');
if(index[arraylist.size()-1]==index[i]){return false;}
}
//排查斜线上,列数不能为上i行列数不能为这一行的+i|-i列
for(int i=arraylist.size()-2,j=1;i>=0;--i,++j){
if(index[arraylist.size()-1]==index[i]-j || index[arraylist.size()-1]==index[i]+j){return false;}
}
return true;
}
}
浙公网安备 33010602011771号