题目:力扣https://leetcode-cn.com/problems/n-queens-ii/
class Solution {
public int totalNQueens(int n) {
Set<Integer> diagonal1 = new HashSet<Integer>();
Set<Integer> diagonal2 = new HashSet<Integer>();
Set<Integer> columns = new HashSet<Integer>();
int[] map = new int[n];
Arrays.fill(map,-1);
return putQueen(n,map,0,columns,diagonal1,diagonal2);
}
private int putQueen(int n,int[] map,int row,Set<Integer> columns,Set<Integer> diagonal1,Set<Integer> diagonal2){
//出口
if(row==n){
return 1;
}else{
int count = 0;
//判断
for(int i=0;i<n;i++){
if(columns.contains(i)){
continue;
}
int dia1 = row-i;
if(diagonal1.contains(dia1)){
continue;
}
int dia2 = row+i;
if(diagonal2.contains(dia2)){
continue;
}
//记录
map[row] = i;
columns.add(i);
diagonal1.add(dia1);
diagonal2.add(dia2);
count += putQueen(n,map,row+1,columns,diagonal1,diagonal2);
//状态重置
map[row] = -1;
columns.remove(i);
diagonal1.remove(dia1);
diagonal2.remove(dia2);
}
return count;
}
}
}
思路:这题与leetcode51.N皇后大同小异,过程是完全一样的,只是leetcode51要求按照规定格式输出,本题只需要输出解的个数。因此,相比于leetcode51.N皇后本题还是简单一些。因此在此不再赘述解题步骤,详情请见leetcode51.N皇后。
1.声明递归方法中需要用到的变量。因为本题不需要按照复杂的格式返回,仅仅需要返回解的数量,所以可以观察到相比于leetcode51少了ans变量。
Set<Integer> diagonal1 = new HashSet<Integer>();
Set<Integer> diagonal2 = new HashSet<Integer>();
Set<Integer> columns = new HashSet<Integer>();
int[] map = new int[n];
Arrays.fill(map,-1);
2.递归方法putQueen修改如下。入参中不需要ans变量,递归出口修改,增加count变量记录解的个数,最后返回count即可。
private int putQueen(int n,int[] map,int row,Set<Integer> columns,Set<Integer> diagonal1,Set<Integer> diagonal2){
//出口
if(row==n){
return 1;
}else{
int count = 0;
//判断
for(int i=0;i<n;i++){
if(columns.contains(i)){
continue;
}
int dia1 = row-i;
if(diagonal1.contains(dia1)){
continue;
}
int dia2 = row+i;
if(diagonal2.contains(dia2)){
continue;
}
//记录
map[row] = i;
columns.add(i);
diagonal1.add(dia1);
diagonal2.add(dia2);
count += putQueen(n,map,row+1,columns,diagonal1,diagonal2);
//状态重置
map[row] = -1;
columns.remove(i);
diagonal1.remove(dia1);
diagonal2.remove(dia2);
}
return count;
}
}
3.在主方法中调用并返回。
return putQueen(n,map,0,columns,diagonal1,diagonal2);