N 皇后 II

weblog 753 0 0

leetcode52题(困难)

原链接: https://leetcode-cn.com/problems/n-queens-ii/

题目描述

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

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

示例 1:
四皇后-示例

输入:n = 4,输出:2

解释:如上图所示,4 皇后问题存在两个不同的解法。

示例 2:

输入:n = 1,输出:1

解题思路

1.上篇 N皇后 问题中已经解决了求解N皇后问题的所有解法并输出所有解,那么 N皇后II 并不需要返回所有解法,而是返回有多少种解法即可,这应该是N皇后问题的简化版本。在成功求出一种解法时计数器加一即可。

N皇后问题参考:http://www.jiajiajia.club/official/weblog/o1nkpk9jowzb/170

代码(java)

方式1
class Solution {
    public int totalNQueens(int n) {
        return begin(n);
    }
    int w,hh;
    boolean [] hang,lie,s,x;
    int c=0;
    public int begin(int n) {
        hang=new boolean[n];
        lie=new boolean[n];
        s=new boolean[2*n-1];
        x=new boolean[2*n-1];
        w=(hh=n)-1;
        dfs(0);
        return c;
    }
    public void dfs(int n){
        if(n>=hh){
            c++;
            return;
        }
        for (int i=0;i<hh;i++){
            int ni=n+i;
            int wi=n+(w-i);
            if(hang[i]||lie[n]||s[ni]||x[wi]){
                continue;
            }else{
                hang[i]=true;lie[n]=true;s[ni]=true;x[wi]=true;
                dfs(n+1);
                hang[i]=false;lie[n]=false;s[ni]=false;x[wi]=false;
            }
        }
    }
}
方式2(积分法)
class Solution {
public int totalNQueens(int n) {
        int[] rs = new int[]{0,1,0,0,2,10,4,40,92,352,724,2680};
        return rs[n];
    }
}

猜你喜欢
ofc N
official 648 leetcode第51题(困难)原链接:https://leetcode-cn.com/problems/n-queens/题目描述n问题研究的是如何将n放置在n×n的棋盘上,并且使
数据结构与算法 7284 问题,是一个古老而著名的问题,是回溯算法的典型案例。该问题是国际西洋棋棋手马克斯·贝瑟尔于1848年提出:在8×8格的国际象棋上摆放八个,使其不能互相攻击,即任意两个都不能处于同一行
official 874 leetcode第589题题目描述给定一个N叉树,返回其节点值的前序遍历。例如,给定一个3叉树:返回其前序遍历:[1,3,5,6,2,4]。解题思路递归遍历,深度优先搜索代码(java
数据库基础 2743 mysql在一个时间的基础上加n(分钟、小时、天)等SELECTDATE_FORMAT(ADDDATE(now(),INTERVAL20MINUTE),'%Y-%m-%d%H:%i:%s')#加20
数据结构与算法 12527 觉图的着色问题类似与八问题,使用回溯算法(试探法)解决算法描述state[n]存储n个顶点的着色方案,可以选择的颜色为1到m。当t=1时,对当前第t个顶点开始着色:若tn,则已求得一个解,输出着色方
weblog 1112 linux系统vivim编辑器查找指定内容(关键字)在命令行模式下按'/'键,然输入你要查找的关键字,回车即可此时你可以按n键向下查找,或按N键向上查找
数据结构与算法 1660 约瑟夫环问题描述有m个人,围成一个环,编号为1、2、3、、、m,从第一个人开始循环报数(从1开始数),假设数到n的那个人出局,然从下一个人继续数数(从1开始数),数到n出列,以此循环,最那个人为
weblog 3200 ; usingSystem.Threading.Tasks; namespaceConsoleApplication3 { classProgram { staticvoidMain(string[]args) { Students=n
目录
没有一个冬天不可逾越,没有一个春天不会来临。最慢的步伐不是跬步,而是徘徊,最快的脚步不是冲刺,而是坚持。