2020_10_17 每日一题 N皇后II

n 皇后问题研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击。

在这里插入图片描述

上图为 8 皇后问题的一种解法。

给定一个整数 n,返回 n 皇后不同的解决方案的数量。

示例:

输入: 4 输出: 2 解释: 4 皇后问题存在如下两个不同的解法。
[
[".Q…", // 解法 1
“…Q”,
“Q…”,
“…Q.”],

["…Q.", // 解法 2
“Q…”,
“…Q”,
“.Q…”] ]

来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/n-queens-ii
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

总感觉昨天每日一题才出过N皇后问题:
N皇后

由于只用求方案数,其实是更省事了,连每行的情况都不用记录了:

class Solution {
    boolean[] cols, ur, ul;
    int ret;
    int N;
    int add;

    boolean isSet(int row, int col) { 
        return ul[row - col + N - 1] || ur[row + col] || cols[col];
    }

    void set(int row, int col, boolean set) {
        ul[row - col + N - 1] = set;
        ur[row + col] = set;
        cols[col] = set;
    }

    void rec(int row) {
        if(row == N) {
            ret += add;
            
            return;
        }
        //System.out.println(row);
        for(int i = 0; i < N; ++i) {
            if(!isSet(row, i)) {
                set(row, i, true);
                rec(row + 1);
                set(row, i, false);
            }
        }
    }

    public int totalNQueens(int n) {
        if(n <= 1)
            return n;
        N = n;
        cols = new boolean[n];
        ur = new boolean[2 * n + 1];
        ul = new boolean[2 * n + 1];
        ret = 0;
        add = 2;

        for(int i = 0; i < n / 2; ++i){
            set(0, i, true);
            rec(1);
            set(0, i, false);
        }

        if(n % 2 == 1) {
            add = 1;
            set(0, n / 2, true);
            rec(1);
        }
        
        return ret;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值