题解 | #N皇后问题#
N皇后问题
https://www.nowcoder.com/practice/c76408782512486d91eea181107293b6
import java.util.*;
public class Solution {
/**
*
* @param n int整型 the n
* @return int整型
*/
/**
思路:
1.利用递归 递归成功进入下一行
2.递归终止条件 已经成功到达第n行 也就是前面n行都成功放入了 最终目标达成才能return 后面的代码不需要再执行 而没有完成目标的 后面的代码还需要执行。
3.j 和 i-j 和 i+j 分别可以确定 列 正斜 反斜
用三个hashSet来判断是否还能放入
*/
int res = 0;
HashSet<Integer> column = new HashSet<>();
HashSet<Integer> posSlant = new HashSet<>();
HashSet<Integer> conSlant = new HashSet<>();
public int Nqueen (int n) {
// write code here
//从第0行开始
compute(0,n);
return res;
}
void compute(int i ,int n){
if(i == n){
//递归终止 不需要再往下面运行
res++;
return ;
}
for(int j = 0 ; j < n ; j++){
if(column.contains(j) || posSlant.contains(i-j) || conSlant.contains(i+j))
continue; //不能放入则跳过
//能放入则添加限制后面的皇后加入条件
column.add(j);
posSlant.add(i-j);
conSlant.add(i+j);
//开始递归下一行
compute(i+1,n);
//递归结束 接触限制条件
conSlant.remove(i+j);
posSlant.remove(i-j);
column.remove(j);
}
}
}
查看11道真题和解析
