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

}

全部评论

相关推荐

点赞 评论 收藏
分享
2024-11-18 09:44
Java
小白也想要offer:简历别放洋屁,搞不还还放错了,当然你投外企除外,以上纯属个人观点
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务