个人感觉非常简洁的一种写法 | #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; } }