题解 | #N皇后问题#

N皇后问题

https://www.nowcoder.com/practice/c76408782512486d91eea181107293b6

import java.util.*;


public class Solution {
    int count = 0;
    boolean[] columns;  // 记录同一列是否已放置皇后
    boolean[] line1;  // 记录从左上到右下的对角线是否已放置皇后
    boolean[] line2; // 记录从左下到右上的对角线是否已放置皇后

    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     *
     * @param n int整型 the n
     * @return int整型
     */
    public int Nqueen (int n) {
        columns = new boolean[n];
        line1 = new boolean[2 * n];
        line2 = new boolean[2 * n];
	    // 从第一行开始放置皇后
        dfs(n, 0);
        return count;
    }

    private void dfs(int n, int r) {
		// 所有行都放了一个皇后,为其中一个答案,count++
        if (r == n) {
            count++;
            return;
        }

        for (int j = 0; j < n; j++) {
		    // 判断当前行:r, 当前列:c以及对角线是否都不存在皇后
            if (!columns[j] && !line1[r + j] && !line2[r - j + n]) {
			    // 当前行放置好
                columns[j] = line1[r + j] = line2[r - j + n] = true;
			    // 到下一行找合适的列放置
                dfs(n, r + 1);
			    // 回溯
                columns[j] = line1[r + j] = line2[r - j + n] = false;
            }
        }
    }
}

全部评论

相关推荐

我已成为0offer的糕手:别惯着,胆子都是练出来的,这里认怂了,那以后被裁应届被拖工资还敢抗争?
点赞 评论 收藏
分享
Noel_:中石油是这样的 哥们侥幸混进免笔试名单 一看给我吓尿了
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务