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

}

全部评论

相关推荐

等闲_:学校的事情,双非要付出别人1.5倍以上的努力的话,学院本想进大厂就要卷成人中龙凤,我见过学院本进大厂的有莆田学院的,一堆牌子加上顶级项目才卷进字节,如果还想走后端的话,得评估一下自己的卷度和能力的扩展度。如果只是以进大厂为目标那前端和测开是最好的选择,如果以当后端开发为目标,进大厂可能就要考虑一下了
点赞 评论 收藏
分享
熊大不大:微信也是华为旗下吧,我看我朋友也是华为工牌写wx
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务