个人感觉非常简洁的一种写法 | #N皇后问题#
N皇后问题
https://www.nowcoder.com/practice/c76408782512486d91eea181107293b6
import java.util.*;
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param n int整型 the n
* @return int整型
*/
public int[] rows;
public int cnt = 0;
public int Nqueen (int n) {
rows = new int[n];
dfs(0);
return cnt;
}
public void dfs(int row) {
if(row == rows.length){
// 是一种安全的情况,情况+1
cnt++;
return;
}
// 先计算第row行安全的列是哪些
ArrayList<Integer> safe = safeLacation(row);
// 如果没有安全的地方说明这种情况不行
if(safe.size() == 0) return;
// 遍历安全的列
for(int col: safe){
// 先标记
rows[row] = col;
// 递归row+1行
dfs(row+1);
}
}
// 计算第row行安全的位置
public ArrayList<Integer> safeLacation(int row) {
ArrayList<Integer> safe = new ArrayList<>();
boolean[] isSafe = new boolean[rows.length];
Arrays.fill(isSafe, true);
for (int i=0; i<=row-1; i++){
// 正下方的列不安全
isSafe[rows[i]] = false;
// 分别计算第i行被干掉的列分成左下和右下
int cr = rows[i] + (row - i);
int cl = rows[i] - (row - i);
// 设置成不安全
if(cr < rows.length){
isSafe[cr] = false;
}
if(cl >= 0){
isSafe[cl] = false;
}
}
// 收集安全的列并返回
for(int i=0; i<rows.length; i++){
if(isSafe[i]){
safe.add(i);
}
}
return safe;
}
}
腾讯公司福利 1145人发布