回溯之N皇后问题

回溯法求解N皇后问题 本文介绍了回溯法及其在解决N皇后问题中的应用。回溯法是一种通过试探性搜索解决问题的算法,核心思想是“尝试-回退”,通过系统性搜索、剪枝优化和递归实现来高效穷举所有可能解。N皇后问题要求在n*n棋盘上放置n个皇后,使得它们互不攻击。文章详细分析了问题的解题思路,提出了剪枝条件函数,并设计了递归和非递归两种算法来实现回溯法。递归法通过递归调用逐行放置皇后,而非递归法则通过迭代实现。总结指出,回溯法通过智能穷举和剪枝优化,在解决组合问题时能显著减少无效搜索,适用于N皇后、数独、图着色等场景,是解决NP难问题的重要 阅读详情

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

每一种解法包含一个明确的 n 皇后问题的棋子放置方案,该方案中 ‘Q’ 和 ‘.’ 分别代表了皇后和空位。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/n-queens

解决思路:
首先这道题难度还是比较大的,因为一般角度来思考的话你会觉得情况太多而无从下手,所以这道题是需要回溯的思想,回溯就是深搜算法中衍生的一种思想,就是当你一条路走不通时,你需要返回上一级继续寻找其他的路径,这个返回上一级就是回溯思想的核心,其实还和递归有一样的成分在其中。你只需要这点就可以了。
好了,现在回到这道题上,需要在n*n的棋盘上放n个皇后,并且要求皇后之间不能在同一行,同一列,同一斜线上,那么这时可以先在棋盘的(0,0)位置放一个皇后,然后第二行再依次放判断哪个位置可以放一个皇后,如果第二行四个位置都不满足那么就说明已经走不通了,就更不需要接着考虑第三行了,这时就需要返回上一行(第一行),再在第一行的第一列放一个皇后(0,1),再重复上述操作,直到行到第四行,就可以找到一个满足要求的情况。

拿4*4来说满足要求的有两种情况如下图所示:
在这里插入图片描述
在这里插入图片描述
如下图所示红蓝斜线的判断公式不一样,一个是横纵坐标之和相同,一个是横纵坐标之差相同。
在这里插入图片描述

代码实现:

class Solution {
public:
    void dfs(vector<vector<pair<int,int>>>& res,vector<pair<int,int>>& sol,int currow,int n){
        if(currow==n){//所有行皇后的位置都已确定,保存这种解决方案,能走完最后一行说明之前都是满足的
            res.push_back(sol);
        }
        for(int i=0;i<n;i++){ //列
             if(isvalid(sol,currow,i)){         //此位置放一个皇后会不会和之前存的坐标相冲突
                 //如果不冲突保存当前坐标
                sol.push_back(make_pair(currow,i));  //solution里存的只是当前满足的坐标
                dfs(res,sol,currow+1,n);       //递归下一行
                sol.pop_back();                //走到这里证明当前行不满足
            }
        }                  //因为如果一行中的每列的位置都不满足,那么就会返回到上一行,这是for循环决定的
    }
    
    bool isvalid(vector<pair<int,int>>& sol,int currow,int col){
        //不在同一列,不在同一斜线上
        for(auto& e: sol){
            if(e.second == col||e.first+e.second==currow+col||e.first-e.second==currow-col){   //这个式子你只需要看在一列上的或者在一斜线上的点的坐标关系
                return false;
            }
        }
        return true;
    }
    
    vector<vector<string>> solveNQueens(int n) {
        //判断是否在同一斜线上,横纵坐标和一样或者横纵坐标差一样
        vector<vector<string>> ret;         //用来保存最终结果,如题要求的那样
        vector<vector<pair<int,int>>> res;  //用来保存最终满足的所有坐标组,例如上面的4*4就有两组坐标集合
        vector<pair<int,int>> sol;          //用来保存当前的可能坐标
        dfs(res,sol,0,n);                            
        for(auto& e:res){                   
            vector<string> retstr(n,string(n,'.'));  //针对每个可能的坐标组初始化要求如题
            for(auto& pos: e){
                retstr[pos.first][pos.second] = 'Q';  //遍历坐标组中满足的坐标来把retstr中的元素变为字符Q,一个Q就代表一个皇后
            }
            ret.push_back(retstr);            
        }
        return ret;                  //返回所有可能的集合
    }
};

总结:
在这里运用c++里的pair就很好的解决了存储以及处理坐标的问题,pair的使用频率还是很高的,尤其是遇到键值对的问题,所以合理使用会让程序变得很简单。回溯的核心就是要找到什么时候可以回退到上一层,找到了的话解决问题也就会变得简单。

回溯法(一)——n皇后问题 问题描述 在一个n*n的棋盘上放置皇后,要求:一个皇后的同一行、同一列、同一条对角线上不允许出现其他皇后。请给出所有的放置方案。 算法思路思路很简单,由于每行每列不能出现两个皇后,因此每行只能放一个皇后,那么第i行中皇后究竟应该放哪儿呢?我们可以从第i行第一列开始依次向后逐格判断,看看若放在当前位置是否会冲突,若不冲突,则继续考虑下一行,若冲突,则继续向后移动一格,再判断。 若i行所有的位置都 阅读详情

相关推荐

N皇后问题(回溯法)

著名的八皇后问题 八皇后问题,是一个古老而著名的问题,是回溯算法的典型案例。该问题是国际西洋棋棋手马克斯·贝瑟尔于1848年提出:在8×8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。 高斯认为有76种方案。1854年在柏林的象棋杂志上不同的作者发表了40种不同的解,后来有人用图论的方法解出92种结果。计算机发明后,有多种计算机语...

qq_36134437的博客 1321

LeetCode-51.N皇后,Python的回溯法实现及详细讲解

51. N皇后 题目: 1. 思路 关于N皇后问题。它也是一个回溯问题。为何?因为它也符合类似”深度优先搜索“的树形思路。 例如,以4皇后为例,4*4的棋盘,假设我们从第一行开始算起,我们会发现,如果你选择第一行第一列(0, 0),那么一次为出发点,你可以去尝试接下来第二行的所有位置(1, 0) ~ (1, 3);假设你第二行选择了合适的放置位置(1, 2),那么你可以接着以[(0,0), (1,2)]为出发点考虑第三行所有位置是否放置皇后合适。 显然,每个合适的皇后放置点,都是一个树形节点的开始,如

谁谓荼苦,其甘如荠 1595

【N皇后问题】递归+回溯算法求解N皇后问题

同一行上面,只能存在一个皇后。同一列上面,只能存在一个皇后。同一斜线上面,只能存在一个皇后。满足上面三个规则的一个放置方法,我们把他叫做N皇后的一个解,常见的N皇后问题有:四皇后、八皇后。对于四皇后问题,可以有下面两种摆放方法:在这里为了程序方便,我们规定:将整个棋盘看作是一个【nxn】的二维矩阵,其中矩阵中每一个单元格位置存放的元素,如果是【.】点号,则表示当前位置没有放置皇后;如果是【Q】符号,则表示当前位置放置了一个皇后。下面具体介绍一下,如何通过程序求解N皇后的问题。

✅ Java 开发工程师 1259

回溯算法笔记,并解决N皇后问题(Python实现)

白话:回溯法可以理解为通过选择不同的岔路口寻找目的地,一个岔路口一个岔路口的去尝试找到目的地。如果走错了路,继续返回来找到岔路口的另一条路,直到找到目的地。

全 洛的博客 5269

NVIDIA DRIVE SDK深度解析(一)——核心组件与安全架构设计

本文深度解析NVIDIA DRIVE SDK的核心组件与安全架构设计,涵盖DriveOS、加速库和应用框架三层架构,以及虚拟化与安全隔离机制。重点探讨了安全岛设计、媒体处理流水线和功能安全监控体系,为开发者提供自动驾驶系统开发的实战建议和性能优化技巧。

weixin_28704565的博客 565

YOLOv8n行人检测实战:从数据集准备到模型训练

本文详细介绍了使用YOLOv8n进行行人检测的完整流程。首先阐述了YOLOv8的优势:高速推理(300+FPS)、更高精度、易用性和轻量化(仅6MB)。接着通过Docker搭建GPU训练环境,配置32GB共享内存避免数据加载问题,并安装必要的框架和OpenCV组件。数据集采用COCO2017标注格式,包含归一化坐标的YOLO标签文件。通过可视化脚本验证标注准确性后,提出多数据集融合训练策略以增强模型泛化能力。最后使用Ultralytics框架启动训练,展现了从环境搭建到模型训练的完整技术路径。该方案兼顾检测

Hi20240217的博客 1091

回溯算法学习(N皇后问题)(python)

最近学习了一下回溯算法,花了好长时间解决N皇后问题,因此在这里我进行记录一下。 回溯算法:实际上一个类似枚举的搜索尝试过程,主要是在搜索尝试过程中寻找问题的解,当发现已不满足求解条件时,就“回溯”返回,尝试别的路径。回溯法是一种选搜索优法,按选优条件向前搜索,以达到目标。但当探索到某一步时,发现原先选择并不优或达不到目标,就退回一步重新选择,这种走不通就退回再走的技术为回溯法,而满足回溯条件的某个状态的点称为“回溯点”。许多复杂的,规模较大的问题都可以使用回溯法,有“通用解题方法”的美称。 框架:

zhaodongdz的博客 2098

Verilog流水线CPU设计(超详细)

快把这一篇给更了

Ace Cheney的博客 7万+

回溯法解决N皇后问题-Python实现(全排列+剪枝)

同系列算法问题 贪心算法解决活动安排-Python实现(排序+贪心选择) N皇后问题 问题 问题概述 分析问题 解决问题 编程 编程流程以及数据类型选择 发现问题以及解决 最终实现 总结 程序缺陷以及完善 解题心路历程 问题 在n*n格的棋盘撒上放置彼此不受攻击的n个皇后。按照国际象棋的规矩,皇后可以攻击与之处在同一行或者同一列或者同一斜线上的棋子。N皇后问题等价于在...

zhj_1121的博客 6286

VHDL按键消抖(状态机版本)

检测下降沿:设置一个和,分别代表之前的之前和之前的信号状态,若两个信号key_in_d2=1,key_in_d1=0,他俩的not key_in_d2 and key_in_d1为1,则说明下降沿产生,把它设置为标志位key_flag。延时计数:50MHz的板子每次计数需要20ns,而抖动时间大约为5-10ms。所以取7ms,作为延时时间。可以看见当检测到下降沿时,开始计数计数计满再次检测,若为低电平则为按下按键,否则为抖动。通过检测下降沿来临,延时计数再次检测,如果为低电平则为按键按下。

qq_69639216的博客 1084

win10 离线安装.Net Framework3.5

起因,安装软件比如3dmax2014等需要.Net Framework3.5支撑,那么需要安装低版本的.Net Framework3.5 闲话少说。 1.下载 NetFx3.cab 链接: https://pan.baidu.com/s/124to7F3BOy4yAlY61OjbDg 提取码: kixu 2.将NetFx3.cab 放入 系统盘的windows目录下(示例 C:\Wi...

m0_37615458的博客 7721

N皇后问题(Python实现)

n皇后问题研究的是如何将n个皇后放置在n×n的棋盘上,并且使皇后彼此之间不能相互攻击。 也就是说:存在一个N*N的棋盘,要放N个棋子,每个棋子不同行,不同列,不同(正反)对角线,如图: 解题思路: 递归 + 回朔 首先我们要给定一个矩阵,来存放棋子,从第一行开始遍历,接着遍历这一行的每一列。假设我们在位置[1, 2]处已经放上棋子,我们开始遍历第二行,首先判断[2,1]位置存放棋...

qq_43235359的博客 1万+

用VSCode远程开发Jetson小车:告别Jupyter,在本地IDE高效调试Rosmaster Python程序

本文详细介绍了如何利用VSCode的Remote-SSH扩展在本地IDE中高效开发Jetson小车的Rosmaster Python程序。通过配置远程开发环境、调试技巧和项目管理方法,开发者可以告别Jupyter Notebook的碎片化编码,实现完整的机器人控制程序开发,显著提升工作效率。

weixin_30652491的博客 477

回溯法之n皇后问题

一、问题 在nxn格的棋盘上放置彼此不受攻击的n格皇后。按照国际象棋的规则,皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子。n后问题等价于在nxn格的棋盘上放置n个皇后,任何2个皇后不放在同一行或同一列或同一斜线上。 二、算法与分析 用数组x[i](1≤i≤n)表示n后问题的解。其中x[i]表示皇后i放在棋盘的第i行的第x[i]列。由于不允许将2个皇后放在同一列,所以解向量中的x[i]...

qq_32919451的博客 7528

6、云计算中的多核技术:架构、并行性与局限性

本博文深入探讨了云计算中多核技术的架构、并行性及其局限性。文章详细介绍了多核处理器的基础概念、并行硬件和软件的设计原理,并对硬件和软件并行性进行了分类和分析。同时,文章讨论了多核架构在实际应用中面临的挑战,如功率墙、内存墙和ILP墙等问题,并提出了应对策略。此外,还总结了多核技术在高性能计算、实时处理和云计算等领域的应用机遇。文章旨在帮助读者更好地理解多核技术的关键问题,并为未来的技术探索提供方向。

java5的博客 122

BAT031:按列表名单将路径a下的文件夹批量剪切到路径b

摘要:按列表名单将路径a下的文件夹批量剪切到路径b。

qq_31762031的博客 1219

回溯法与N皇后问题

回溯法 回溯法是用来解决这样的问题:在相对于问题的输入规模按照指数速度增长的域中,找出一个具有指定特性的元素,如在图顶点的所有排列中求一个哈密顿回路,或者背包问题。 回溯法实际上是对穷举查找的优化。它通过对所做的选择构造一颗所为的空间状态树来实现。具体来说,树的根节点表示在查找前的初始状态,树的第一层节点表示对解得第一个分量做的选择,以此类推。如果一个部分的构造解仍然有可能导致一个完整解,我...

zpznba的博客 7040

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

回溯算法——n皇后问题

盘上摆放n个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一对角线上,问有多少种摆法。我们可以思考,回溯算法,用最直白的话解释就是,当前这路不通,怎么办,回去,到上一个位置换个方向;,在一个集合中递归找子集,集合的大小就可以理解为需要递归的层;,不然就在函数体中出不来,会出错。、对于这三个规则,所以我们的核心层就应该,有两个判断(),就需要回溯到上一行皇后,更改上一行皇后的列。),就需要回溯到上一行皇后,更改上一行皇后的列。,那就结束呗,无路可走还继续呆着干嘛,哈哈哈哈;

桑稚远方的博客 3994

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

【算法-回溯法】N皇后问题

回溯法 N皇后问题

@point 1万+

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

N皇后问题【java】【回溯法】

N皇后问题【java】【回溯法】N皇后问题概述N皇后问题java代码解析 N皇后问题概述 要想解决n皇后问题,首先要明白什么是n皇后问题。 在本篇文章中,借助 leetcode 51.N皇后问题 进行解析。 N皇后问题题目: n 皇后问题 研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击。 给你一个整数 n ,返回所有不同的 n 皇后问题 的解决方案。 每一种解法包含一个不同的 n 皇后问题 的棋子放置方案,该方案中 ‘Q’ 和 ‘.’ 分别代表了皇后和空位。 由上述题目

qq_51133939的博客 2888

使用回溯算法求解N皇后问题

文章目录N皇后问题描述回溯算法简介回溯算法对问题的要求回溯算法的思想回溯算法的模板使用回溯算法求解N皇后问题 N皇后问题描述 在一个N * N的国际象棋棋盘上需要放置N个皇后,放置时要保证这些皇后不能攻击彼此,也就是要保证在同一行、同一列、同一斜线上都只有一个皇后。该问题要求求出所有满足要求的放置方案。 回溯算法简介 回溯算法对问题的要求 当一个问题满足: 多步:需要多步来完成 多选:每一步有...

folkboat的博客 1517

n皇后问题(回溯法)

1.问题描述: 在N*N的格子上,放置N个皇后,任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法: 2.算法思想: ------用回溯法解决该问题: 回溯法----在包含问题的所有解的解空间树中,按照深度优先搜索的策略,从根结点出发深度探索解空间树。当探索到某一结点时,要先判断该结点是否包含问题的解,如果包含,就从该结点出发继续探索下去,如果该结点不包含问题的解,则逐层向其

Limbos的博客 7966

使用回溯法求解N皇后问题

目录N皇后问题回溯法思路数据表示判断冲突方法方法实现 N皇后问题 经典的N皇后问题描述为:在一个N x N的棋盘上放置N个皇后,要求任意的两个皇后都不在同一行、同一列或同一条对角线上,问在给定N的情况下有多少种放置的方法。 回溯法思路 求解N皇后最典型的方法是回溯法,此方法的思路可以概括为:在第一行占据一个位置,接着在下一行占据一个位置,判断两个位置之间是否存在冲突。如果不存在冲突,则继续在下下行占据一个位置,判断与前面的两个位置之间是否存在冲突,如果不存在冲突则继续往下占据位置,当占据到最后一行,且占据的

hlld__的博客 8374

回溯法解决n皇后问题

回溯法解决n皇后问题 代码如下: #include <iostream> #include <stdio.h> #include <stdlib.h> #define N 20 //最多皇后个数 using namespace std; int q[N]; //存放各皇后所在的列号,为全局变量 int num = 0;

慢慢的博客 2785
上一篇: dp(动态规划)之最长公共子序列
Python_programer
博客等级 码龄9年 25粉丝 57原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值