• 首页 首页 icon
  • 工具库 工具库 icon
    • IP查询 IP查询 icon
  • 内容库 内容库 icon
    • 快讯库 快讯库 icon
    • 精品库 精品库 icon
    • 问答库 问答库 icon
  • 更多 更多 icon
    • 服务条款 服务条款 icon

leetcode--N 皇后 II(java)

武飞扬头像
SP_1024
帮助1

leetcode 52 题 - N 皇后 II (困难)

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

题目描述

n 皇后问题 研究的是如何将 n 个皇后放置在 n × n 的棋盘上,并且使皇后彼此之间不能相互攻击。
给你一个整数 n ,返回 n 皇后问题 不同的解决方案的数量。

示例1:
学新通
输入:n = 4
输出:2
解释:如上图所示,4 皇后问题存在两个不同的解法。

示例2 :
输入:n = 1
输出:1

解题思路

我们用递归来解决这个问题:
我们一行一行的去验证哪列可以放置皇后,
(因此这个思路就推导出,需要循环加递归)

每到一行,我们只需要验证他前面皇后放的位置,来确定他哪里能放.
验证的方法:
同一列有的肯定不能放了
还有就是斜线位置怎么验证,
举个例子:
A 点(1,2) 和B 点 (2,3) 这两个点在一条斜线上,
那么 1-2 肯定等于 2 - 3 .,
也就是A 的行号 - B 的行号 等于A 的列号 - B 的列号.

代码演示

代码可以放到leetcode 上去测试

public int totalNQueens(int n) {
        if(n < 1){
            return 0;
        }
        // 这个数组 下标来记录行号 值代表列 记录哪行哪列有皇后
        int[] ans = new int[n];
        return process(0,ans,n);

    }
	/**
	* i 代表 行号
	* n 总共几个皇后
	* record 记录已经防置皇后的位置
	*/
    public int process(int i,int[]record,int n){
     	//i == n 代表所有行都校验通过才来到这里  所以返回一种方案
       if(i == n){
           return 1;
       }
    int res = 0;
    //j 代表列号 每到一个行我们就考察所有列,能放在哪一列上
    for(int j = 0;j < n;j  ){
        if(checkPostion(record,i,j)){
        //皇后位置记录下来
            record[i] = j;
            //递归 行号加1 
            res  = process(i 1,record,n);
        }
    }

    return res;

    }
	/**
	* 验证这个位置可以放不可以放
	*/
    public boolean checkPostion(int[]record,int i,int j){
       for(int k = 0; k < i;k  ){
       //同一列有皇后不能放,和斜线有皇后不能放
           if(record[k] == j || Math.abs(record[k] - j) == Math.abs(i - k)){
               return false;
           }
       }
       return true;
    }
学新通

动态规划专题

纸牌博弈问题–动态规划

爬楼梯问题-从暴力递归到动态规划

走到指定位置有多少种方式-从暴力递归到动态规划

零钱兑换,凑零钱问题,从暴力递归到动态规划

斐波那契数列-从暴力递归到动态规划

这篇好文章是转载于:学新通技术网

  • 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
  • 本站站名: 学新通技术网
  • 本文地址: /boutique/detail/tanhggiebf
系列文章
更多 icon
同类精品
更多 icon
继续加载