栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

N皇后问题

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

N皇后问题

51. N 皇后 - 力扣(LeetCode) (leetcode-cn.com)https://leetcode-cn.com/problems/n-queens/submissions/

目录

方法一:采用深度探索与递归的方法进行选择

方法二:使用数字的位信息


方法一:采用深度探索与递归的方法进行选择

可取之处是将判断与遍历拆分成为两个子函数,这样有利于增加可读性。

同时使用一维向量xi记录第几行的皇后放在第几个位置上。

同时应该注意关于数据结构(队列,栈,向量,哈希表)作为参数传入函数时,

如果要求在void函数里面对上述类型的参数进行修改,要加”&“(比如以前的深度遍历等要对结果进行改变,所以要加”&“)

但如果不要求在void函数里对上述类型的参数进行改变,则不加”&“,表示复制一份该参数传进函数,这样你如何对函数里的参数进行改变都不影响我原参数,因为你改变的只是我的复制品。这种情况适用于该题目这种会有很多种可能的结果,但是在分叉处我要下面两条路都要走,如果以第一种方式传入参数,那么会对原参数进行改变,这样你走完第一条路你把分叉处的参数都改变了,我怎么从原来的参数走第二条路!所以要使用第二种传入参数的方式,这样相当于复制了一份传入子路的函数,同时在这条路走完不影响另一条子路的前进。

class Solution {
public:
void play(vector>&result, int n, vectorxi,int i){//i表示当前处理第几行
    for(int j=0;jone(n);
                for(int p=0;pxi){
    for(int p=0;p> solveNQueens(int n) {
        vectorxi(n);
        vector>result;//每一行里面都表示一种排列方案
        play(result,n,xi,0);
        return result;
    }
};

方法二:使用数字的位信息

对于每一行放了一个皇后,对后面产生的影响包括“左斜线限制,右斜线限制,列限制”

通过数字的为信息表示禁止位置的变化

如果当前行放了皇后,那么算上当前行以及前面行的左限制为“(left|a)<<1)”,同理右限制“(right|a)/2”,列限制为“down|a”。

写一个二进制表示为n位“1”的int数据,limit的作用是限制位数,它从始至终都是n位1。防止左移啥的位数超出限制。

class Solution {
public:
void bianli(vector>&result,int limit,int left,int right,int down,int n,vectorone,int i){
    if(down==limit){
        vectoroneCase;
        for(int i=0;i> solveNQueens(int n) {
        vector>result;//if(n>31){return result;}
        vectorone(n);
        int limit=1;
        for(int i=0;i 

在解答过程在“one[i]=lie-1;”曾写为“one.push_back(lie-1);”但是这样带来的问题是while里面每一次都会在后面写上新的,逻辑出现错误,所以应该改变第i位的值而不是每次都添加。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/628889.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号