首页 > 其他分享 >N皇后问题--解法一(递归遍历斜线)

N皇后问题--解法一(递归遍历斜线)

时间:2022-10-26 15:36:01浏览次数:49  
标签:midNum 遍历 HashSet -- 斜线 len int && new

import java.util.*;
import java.math.*;

public class Solution {

    TreeSet<Integer> ready = new TreeSet<Integer>();
    HashSet<Integer> res = new HashSet<Integer>();
    Integer midNum = 0;
    //已经摆放几个
    int leng = 0;
    //多少种摆法
    int count = 0;
    int len = 0;
    boolean found = false;
    HashSet<Integer> readyX = new HashSet<Integer>();
    HashSet<Integer> readyY = new HashSet<Integer>();
    /**
     *
     * @param n int整型 the n
     * @return int整型
     */
    public int Nqueen (int n) {
        len = n;
        recursion();
        return res.size();
    }
    private void recursion() {

        if (leng == len) {
            midNum = 0;
            //ready 元素顺序不同,迭代的直不同,所以要去重的话,只能使用treeset排序
            ready.forEach(x-> midNum = 31*midNum + x);
            //利用hashset去重
            res.add(midNum);
         //  }
            
            return;
        }
        for (int x = 1 ; x <= len; x++ ) {
            for (int y = 1 ; y <= len ; y++) {
                found = false;
                //沿着斜线判断
                find(x, y, 1);
                find(x, y, 2);
                find(x, y, 3);
                find(x, y, 4);
                if (!found && !readyX.contains(x) && !readyY.contains(y)) {
                    leng++;
                    int hashCode = 31 * (31 * 1 + y) + x;
                   // String hashCode = x + "-" + y;
                    ready.add(hashCode);
                    readyX.add(x);
                    readyY.add(y);
                    //进入下一个寻找Q的迭代
                    recursion();
                    //每确定一个Q的位置,回溯
                    //回溯只能保证当前Q进入其他分支,但是其他Q仍然可以在当前分支
                    //而每个Q的位置要考虑的是组合而不是排列
                    ready.remove(hashCode);
                    readyX.remove(x);
                    readyY.remove(y);
                    leng--;
                    //一行只能有一个Q
                    break;
                }
            }
        }


    }
    private void find(int x, int y, int num) {

        if (found) {
            return;
        }
        int hashCode = 31 * (31 * 1 + y) + x;
        //String hashCode = x + "-" + y;
        if (ready.contains(hashCode)) {
            found = true;
            return;
        }
        //斜线
        if (num == 1 && x < len && y < len)
            find(x + 1, y + 1, 1);
        if (num == 2 && x < len && y > 0)
           find(x + 1, y - 1, 2);
        if (num == 3 && x > 0 && y < len)
            find(x - 1, y + 1, 3);
        if (num == 4 && x > 0 && y > 0)
            find(x - 1, y - 1, 4);

    }
}

  

标签:midNum,遍历,HashSet,--,斜线,len,int,&&,new
From: https://www.cnblogs.com/yanher/p/16828559.html

相关文章

  • 9个计算机的“网络层”知识点
    摘要:网络层介于传输层和数据链路层之间,其主要作用是实现两个网络系统之间的数据透明传送,具体包括路由选择,拥塞控制和网际互连等。本文分享自华为云社区《​​计算机的“网络......
  • Scala-隐式转换
    隐式转换精度小的类型可以自动转换为精度大的类型,这个转换过程无需开发人员参与,由编译器自动完成,这个转换操作我们称之为隐式转换。如果程序编译出错,编译器会尝试在整个......
  • STW78N65M5-ASEMI原厂代理意法MOS管STW78N65M5
    编辑-ZSTW78N65M5用的TO-247封装,是意法一款汽车级MOS管。STW78N65M5的漏源导通电阻RDS(on)为0.024Ω,零栅极电压漏极电流(IDSS)为1uA,栅源漏电流(IGSS)为100nA,其工作时耐温度范围......
  • 【ManageEngine】IT服务管理(ITSM)指南
    IT服务管理(ITSM)是什么IT服务管理(ITservicemanagement简写ITSM)是IT团队向其最终用户提供:设计、交付、管理和改善等所有IT服务的过程。ITSM致力于使IT流程和服务与业务目......
  • 实验7:基于REST API的SDN北向应用实践
    1.编写Python程序,调用OpenDaylight的北向接口实现以下功能(1)利用Mininet平台搭建下图所示网络拓扑,并连接OpenDaylight搭建拓扑sudomn--topo=single,3--controller=re......
  • 网速一天比一天慢,路由器要不要每天重启?
    路由器知识库,分享电脑,网络小常识,享受科技新生活!大家好,我是路由器知识库的“库哥”,今天分享的小知识是:路由器要不要每天重启?路由器的重要性现在已经是不言而喻的,因为在当下的......
  • 查看Linux 位数和发行版名称、版本
    位数:getconfLONG_BIT或getconfWORD_BIT或file/bin/ls发行版:uname-acat/etc/issuelsb_release-d发行版描述lsb_release-a全部信息CentOS(RedHad):cat/etc/re......
  • lvm卷 扩容
    lvdisplay#查看已经存在的LV信息,以存在LV:LogVol01为例创建:lvcreate-L90G-nLogVol01VolGroup00扩展:lvextend–L+1G/dev/VolGroup00/LogVol01#扩展LVresize2fs......
  • 如何在iPad上直接打开并运行GitHub上的代码?
    在2005年,LinusTorvalds开创了一个名为Git的开源版本控制系统。开发者在使用Git作为版本控制系统时,能够获取项目的整个代码库和修改历史。因此,他们也能更轻易地新建分支和合......
  • 工作中常用的SQL语句
    1.SQL篇1.根据一个spbh字段分组,然后取分组后每个spbh的created最新值select*from(select*fromt_userhaving1ORDERBYcreateddesc)aGROUPBYs......