n 皇后问题研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击。
上图为 8 皇后问题的一种解法。
给定一个整数 n,返回所有不同的 n 皇后问题的解决方案。
每一种解法包含一个明确的 n 皇后问题的棋子放置方案,该方案中 ‘Q’ 和 ‘.’ 分别代表了皇后和空位。
回溯算法
class Solution {
public List<List<String>> solveNQueens(int n) {
List<List<String>> res = new ArrayList();
Set<Integer> lie = new HashSet();
Set<Integer> pie = new HashSet();
Set<Integer> na = new HashSet();
int nums[] = new int[n];
Arrays.fill(nums,-1);
back(n,0,lie,pie,na,nums,res);
return res;
}
public void back(int n,int row,Set<Integer> lie,Set<Integer> na,Set<Integer> pie,int nums[],List<List<String>> res){
if(row==n){
List<String> result = genResult(nums,n);
res.add(result);
return;
}
for(int i=0;i<n;i++){
if(lie.contains(i)){
continue;
}
int pies = row+i;
if(pie.contains(pies)){
continue;
}
int nas = row-i;
if(na.contains(nas)){
continue;
}
nums[row]=i;
lie.add(i);
pie.add(pies);
na.add(nas);
back(n,row+1,lie,na,pie,nums,res);
nums[row]=-1;
lie.remove(i);
pie.remove(pies);
na.remove(nas);
}
}
public List<String> genResult(int[] queens,int n) {
List<String> tempResult = new ArrayList();
for (int i=0;i<queens.length;i++) {
char[] row = new char[n];
Arrays.fill(row,'.');
row[queens[i]] = 'Q';
tempResult.add(new String(row));
}
return tempResult;
}
}