`
ttwang
  • 浏览: 336063 次
  • 性别: Icon_minigender_2
社区版块
存档分类
最新评论

通过8皇后问题浅析回溯法的递归实现

 
阅读更多

8皇后问题是一道非常经典的题目。当初我是怎么也不能明白怎么用回溯法来解此题的。现在似乎明白些了,先贴出来。

       题目大家都是知道的,就不多说了。其实,题目就是要找出所有的可能情况,然后排除其中不符合条件的情况,剩下的情况即为所要求的。怎么找出所有的情况呢?对于8皇后,我们可以使用穷举法,穷举出每一种放置方法,然后判断是否符合题意。如果每次放一行,那就需要8重循环才可以解出来。虽然空间复杂度可以小到为0,但是时间复杂度太高。 

        书中一般使用回溯法来解此题。仔细分析此题,可以发现:每一行上只能放置一个皇后,然后后面每行放置的皇后,不能与前面的行上放置的皇后在同一列上或者同一对角线上。所以用一个一维数组就可以存放在棋盘上放置的皇后的行列信息:一维数组的第i个位置存放的数值j就表示,在棋盘的第i行、第j列上放着一个皇后。棋盘的一行就用一个元素来表示,所以不能在同一行就不用判断了。知道了皇后在棋盘的行列位置后,判断是否符合后面的两个条件也比较容易了(对角线只要仔细分析下,两个二维坐标点如果在对角线上,他们的行列坐标将会满足何种情况即可)。

        搞定了数据结构,接着就要考虑如何进行回溯搜索了。回溯一般借用递归来实现。用我的一个ACM非常牛的一个同学的话来说:回溯就是让计算机自动的去搜索,碰到符合的情况就结束或者保存起来,在一条路径上走到尽头也不能找出解,就回到原来的岔路口,选择一条以前没有走过的路继续探测,直到找到解或者走完所有路径为止。就这一点,回溯和所谓的DFS(深度优先搜索)是一样的。那现在的关键是,怎么实现搜索呢?回溯既然一般使用递归来实现,那个这个递归调用该如何来写呢?我现在的理解就是,进行回溯搜索都会有一系列的步骤,每一步都会进行一些查找。而每一步的情况除了输入会不一样之外,其他的情况都是一致的。这就刚好满足了递归调用的需求。通过把递归结束的条件设置到搜索的最后一步,就可以借用递归的特性来回溯了。因为合法的递归调用总是要回到它的上一层调用的,那么在回溯搜索中,回到上一层调用就是回到了前一个步骤。当在当前步骤找不到一种符合条件情况时,那么后续情况也就不用考虑了,所以就让递归调用返回上一层(也就是回到前一个步骤)找一个以前没有尝试过的情况继续进行。当然有时候为了能够正常的进行继续搜索,需要恢复以前的调用环境。

下面贴出8皇后问题的代码:

#include <iostream>
#include 
<cmath>
using namespace std;

void PrintResult(int *arr, int n)
{
    
for (int i = 1; i != n + 1++i)
        cout 
<< "(" << i << "," << arr[i] << ")" << " ";
    cout 
<< endl;
}

bool Verify(int *arr, int i)
{
    
/* 和前面的i - 1行比较,看当前放置位置是否合法?*/
    
for (int k = 1; k != i; ++k)
        
if (arr[k] == arr[i] || abs(i - k) == abs(arr[i] - arr[k]))
            
return false;
    
return true;
}
/* 虽然只用了一个一维数组,但是其中已经保存了足够的信息。
因为每一行只能放一个皇后,所以一维数组的第i个位置存放的
是在第i行的哪一列(第j列)上放置了皇后。这个递归函数
每次处理一行,直到第n行(下标从1开始)。
*/
void NQueens(int *arr, int i, int n)
{
    
/* 尝试着在第i行的第j列放置一个皇后。*/
    
for (int j = 1; j != n + 1++j)
    {
        arr[i] 
= j;
        
if (Verify(arr, i))
        {
            
/* 这个递归程序的结束条件是第n行放置完毕,
            所以,当递归函数从调用NQueens(arr, i + 1, n)返回时,
            就是回到了第i行,继续搜索合适的位置。当第i + 1行的
            所有位置都不能满足的时候,上面的调用就会返回,也就
            是进行了所谓的回溯。这个回溯不需要显示的恢复以前的
            调用环境,因为所需要的信息没有被破坏。
*/
            
if (i == n)
                PrintResult(arr, n);
            
else
                NQueens(arr, i 
+ 1, n);
        }
    }
}

int main()
{
    
int n;
    cin 
>> n;
    
int *arr = new int[n + 1];
    NQueens(arr, 
1, n);

    
return 0;
}
分享到:
评论

相关推荐

    浅析回溯算法

    回溯算法是一种试探性的解决问题的方法,它在搜索...通过对《回溯法分析》文档的深入学习,我们可以掌握回溯算法的基本原理、实现方法以及在实际问题中的应用技巧,这对于解决复杂优化问题和提升编程能力具有重要意义。

    基于分时电价机制的家庭能量管理策略优化研究:考虑空调、电动汽车及可平移负荷的精细控制模型,基于分时电价机制的家庭能量管理策略优化研究:集成空调、电动汽车与可平移负荷管理模型,MATLAB代码:基于分时

    基于分时电价机制的家庭能量管理策略优化研究:考虑空调、电动汽车及可平移负荷的精细控制模型,基于分时电价机制的家庭能量管理策略优化研究:集成空调、电动汽车与可平移负荷管理模型,MATLAB代码:基于分时电价条件下家庭能量管理策略研究 关键词:家庭能量管理模型 分时电价 空调 电动汽车 可平移负荷 参考文档:《基于分时电价和蓄电池实时控制策略的家庭能量系统优化》参考部分模型 《计及舒适度的家庭能量管理系统优化控制策略》参考部分模型 仿真平台:MATLAB+CPLEX 平台 优势:代码具有一定的深度和创新性,注释清晰,非烂大街的代码,非常精品 主要内容:代码主要做的是家庭能量管理模型,首先构建了电动汽车、空调、热水器以及烘干机等若干家庭用户用电设备的能量管理模型,其次,考虑在分时电价、动态电价以及动态电价下休息日和工作日家庭用户的最优能量管理策略,依次通过CPLEX完成不同场景下居民用电策略的优化,该代码适合新手学习以及在此基础上进行拓展 ,核心关键词: 家庭能量管理模型; 分时电价; 电动汽车; 空调; 可平移负荷; 优化控制策略; 仿真平台(MATLAB+CPLEX); 深度创新性。,

    Delphi 12 控件之Winsoft PDFium Component Suite v7.4 for Delphi & CB 5-12 Athens Full Source.7z

    Winsoft PDFium Component Suite v7.4 for Delphi & CB 5-12 Athens Full Source.7z

    基于Matlab的草原生态管理策略研究:数学建模及E前四问问题分析思路,基于Matlab的草原放牧策略研究:数学建模与问题解决的前四问思路,基于Matlab的草原放牧的策略研究数学建模E前四问思路

    基于Matlab的草原生态管理策略研究:数学建模及E前四问问题分析思路,基于Matlab的草原放牧策略研究:数学建模与问题解决的前四问思路,基于Matlab的草原放牧的策略研究数学建模E前四问思路 ,基于Matlab的草原放牧策略研究; 数学建模; E前四问思路; 策略优化; 模型验证; 数据模拟。,Matlab草原放牧策略研究:数学建模E及前四问解析

    JSP基于SSH2新闻发布系统.zip(毕设&课设&实训&大作业&竞赛&项目)

    项目工程资源经过严格测试运行并且功能上ok,可实现复现复刻,拿到资料包后可实现复现出一样的项目,本人系统开发经验充足(全栈全领域),有任何使用问题欢迎随时与我联系,我会抽时间努力为您解惑,提供帮助 【资源内容】:包含源码+工程文件+说明等。答辩评审平均分达到96分,放心下载使用!可实现复现;设计报告也可借鉴此项目;该资源内项目代码都经过测试运行,功能ok 【项目价值】:可用在相关项目设计中,皆可应用在项目、毕业设计、课程设计、期末/期中/大作业、工程实训、大创等学科竞赛比赛、初期项目立项、学习/练手等方面,可借鉴此优质项目实现复刻,设计报告也可借鉴此项目,也可基于此项目来扩展开发出更多功能 【提供帮助】:有任何使用上的问题欢迎随时与我联系,抽时间努力解答解惑,提供帮助 【附带帮助】:若还需要相关开发工具、学习资料等,我会提供帮助,提供资料,鼓励学习进步 下载后请首先打开说明文件(如有);整理时不同项目所包含资源内容不同;项目工程可实现复现复刻,如果基础还行,也可在此程序基础上进行修改,以实现其它功能。供开源学习/技术交流/学习参考,勿用于商业用途。质量优质,放心下载使用,资源为网络商品(电子资料类)基于网络商品和电子资料商品的性质和特征不支持退款,质量优质,放心下载使用

    LanSee175(局域网查看工具)

    主要功能 信息搜索:可快速搜索局域网中的计算机,获取计算机名、IP 地址、MAC 地址、所在工作组、用户等详细信息,还能搜索共享资源和共享文件,便于用户快速定位和访问所需资源。 网络嗅探:能够捕获 TCP、UDP、ICMP、ARP 等各种数据包,可嗅探局域网上的 QQ 号,查看各主机流量,还能从流过网卡的数据中嗅探出音乐、视频、图片等文件,帮助用户了解网络数据传输情况。 聊天与共享:具备局域网聊天和文件共享功能,无需服务器支持。用户可进行群聊或私聊,还能指定条件搜索其他用户共享的文件,方便局域网内的信息交流与资源共享。 计算机管理:可以向开启信使服务的计算机发送短消息,对于有相应权限的计算机,还能进行远程关闭或重启操作,方便网络管理员进行集中管理。 文件复制:支持复制网上邻居上的共享文件、LanSee 用户共享的文件以及通过网络嗅探功能嗅探出的文件,并且支持断点传输,提高文件复制的效率和稳定性。 端口与连接查看:可列出进程打开的所有网络端口以及连接情况,能快速扫描 TCP 端口,查看适配器信息,还能进行 Ping、Traceroute 等操作,帮助用户了解网络连接状态和诊断网络问题。

    迅雷软件下载原理介绍.md

    迅雷软件下载原理介绍.md

    最新更新!!!2024年HS编码出口退税率数据(2004-2024年)

    ## 01、数据简介 出口退税率是针对出口产品在国内已缴纳的税款,在货物报关出口后退还给出口企业时,按照一定比例计算的退税金额与计税价格之间的比率。 出口退税率是出口退税制度中的一个重要参数,它体现了国家对出口企业的税收优惠政策,有助于降低企业的出口成本,提升其在国际市场上的竞争力。同时,国家也会根据经济形势和国际贸易的变化,适时调整出口退税率,以更好地服务于国家的经济发展战略。 数据名称:2024年HS编码出口退税率数据 数据年份:2004-2024年 ## 02、相关数据 CODE、ST_DATE、END_DATE、ZHCMCODE、NAME、DWCODE、UNIT、BCFLAG、STDFLAG、DWFLAG、SZ、ZSSL_SET、CLDE、CJDL、TSL、SPLB、TSFLAG、NOTE。 ## 03、数据截图

    风机变桨控制FAST与MATLAB SIMULINK联合仿真模型:非线性风力发电机的PID独立与统一变桨控制策略对比研究,风机变桨控制FAST与MATLAB联合仿真研究:非线性风力发电机的PID独立与

    风机变桨控制FAST与MATLAB SIMULINK联合仿真模型:非线性风力发电机的PID独立与统一变桨控制策略对比研究,风机变桨控制FAST与MATLAB联合仿真研究:非线性风力发电机的PID独立与统一变桨控制在Trubsim 3D湍流风环境下的对比分析,风机变桨控制FAST与MATLAB SIMULINK联合仿真模型非线性风力发电机的 PID独立变桨和统一变桨控制下仿真模型,对于5WM非线性风机风机进行控制 链接simulink的scope出转速对比,桨距角对比,叶片挥舞力矩,轮毂处偏航力矩,俯仰力矩等载荷数据对比图,在trubsim生成的3D湍流风环境下模拟 统一变桨反馈信号是转速,独立变桨反馈是叶根载荷 提供包含openfast与matlab simulink联合仿真的建模 可以提供参考文献+模型+大佬交流群 ,核心关键词:FAST; MATLAB SIMULINK; 联合仿真模型; 非线性风力发电机; PID控制; 独立变桨; 统一变桨; 转速对比; 桨距角对比; 叶片挥舞力矩; 轮毂偏航力矩; 俯仰力矩; 3D湍流风环境; 建模; 参考文献; 模型交流群。,基于OpenF

    基于Unity,SenseAR的手势识别demo.zip(毕设&课设&实训&大作业&竞赛&项目)

    项目工程资源经过严格测试运行并且功能上ok,可实现复现复刻,拿到资料包后可实现复现出一样的项目,本人系统开发经验充足(全栈全领域),有任何使用问题欢迎随时与我联系,我会抽时间努力为您解惑,提供帮助 【资源内容】:包含源码+工程文件+说明等。答辩评审平均分达到96分,放心下载使用!可实现复现;设计报告也可借鉴此项目;该资源内项目代码都经过测试运行,功能ok 【项目价值】:可用在相关项目设计中,皆可应用在项目、毕业设计、课程设计、期末/期中/大作业、工程实训、大创等学科竞赛比赛、初期项目立项、学习/练手等方面,可借鉴此优质项目实现复刻,设计报告也可借鉴此项目,也可基于此项目来扩展开发出更多功能 【提供帮助】:有任何使用上的问题欢迎随时与我联系,抽时间努力解答解惑,提供帮助 【附带帮助】:若还需要相关开发工具、学习资料等,我会提供帮助,提供资料,鼓励学习进步 下载后请首先打开说明文件(如有);整理时不同项目所包含资源内容不同;项目工程可实现复现复刻,如果基础还行,也可在此程序基础上进行修改,以实现其它功能。供开源学习/技术交流/学习参考,勿用于商业用途。质量优质,放心下载使用,资源为网络商品(电子资料类)基于网络商品和电子资料商品的性质和特征不支持退款,质量优质,放心下载使用

    jdk-8u441-windows-x64.zip

    java8版本的压缩包(windows)

    NMPC非线性模型预测控制:从原理到代码实践的全面解析,包含四项案例研究:自动泊车轨迹优化、倒立摆上翻控制、车辆运动学轨迹跟踪及四旋翼无人机轨迹跟踪,非线性模型预测控制在四个案例中的实践与应用:从原理

    NMPC非线性模型预测控制:从原理到代码实践的全面解析,包含四项案例研究:自动泊车轨迹优化、倒立摆上翻控制、车辆运动学轨迹跟踪及四旋翼无人机轨迹跟踪,非线性模型预测控制在四个案例中的实践与应用:从原理到代码实操指南,nmpc非线性模型预测控制从原理到代码实践 包含4个案例 1 自动泊车轨迹优化 2 倒立摆上翻控制 3 车辆运动学轨迹跟踪 4 四旋翼无人机轨迹跟踪 ,nmpc;非线性模型预测控制;原理;代码实践;案例;自动泊车轨迹优化;倒立摆上翻控制;车辆运动学轨迹跟踪;四旋翼无人机轨迹跟踪,NMPC非线性模型预测控制:原理与代码实践,四案例详解(含自动泊车、倒立摆、车辆轨迹跟踪及四旋翼无人机控制)

    Delphi 12 控件之Gnostice PDFToolkit v.5.0.0.860 for Delphi 11.7z

    Gnostice PDFToolkit v.5.0.0.860 for Delphi 11.7z

    CAD-Reader(cad快速看图)

    快速打开图纸:具有闪电般的启动速度,能快速打开各种版本的 DWG 图纸,让用户迅速开始查看和使用图纸。 显示完整准确:全面完整地显示布局、图案填充等内容,可自动匹配所有字体,有效解决中文乱码问题,能完美显示钢筋符号。 支持天正系列:是业内支持天正建筑、天正给排水、天正暖通、天正电气的 CAD 看图产品,方便建筑、给排水等相关专业人员查看和使用天正图纸。 便捷传图功能:内置 WiFi 直连电脑、云盘功能,方便用户在不同设备之间轻松传图,实现图纸的快速传输和共享。 多种操作功能:可添加各种注释,如线条、文字、图片等,还能精确扣点,方便用户对图纸进行标记和说明;具有所见即所得的打印方式,可自由设置打印范围;支持全屏看图,让用户获得更好的查看体验。 测量统计功能:能准确测量长度、半径、角度、弧长、坐标、多边形面积等,还可自动统计测量的长度和面积,可按颜色统计或手动统计,结果能导出表格。 高效协作功能:支持团队协同,用户可以在移动中处理工作,与合作伙伴随时沟通;可以捕获现场照片和录制语音消息并作为注释附加到图纸上,还能导入 / 导出图纸注释。

    单向手性光学腔的研究与应用 - Comsol的光学物理分析与实现,“Comsol模拟下的单向手性光学腔特性探究”,Comsol单向手性光学腔 ,核心关键词:Comsol; 单向手性; 光学腔; 模拟

    单向手性光学腔的研究与应用 - Comsol的光学物理分析与实现,“Comsol模拟下的单向手性光学腔特性探究”,Comsol单向手性光学腔。 ,核心关键词:Comsol; 单向手性; 光学腔; 模拟。,单向手性光学腔的Comsol模拟研究

    CDlinux镜像文件.zip

    目录: CDlinux_CE-0.9.5 CDlinux_CE-0.9.6.1 CDlinux_CE-0.9.7.1 CDlinux_mini-0.9.5 CDlinux_mini-0.9.6.1 CDlinux_mini-0.9.7.1 CDlinux-0.9.5.1 CDlinux-0.9.6.1 CDlinux-0.9.6 CDlinux-0.9.7.1 CDlinux-0.9.7 ........... 网盘文件永久链接

    基于maven的SSM整合 demo项目.zip(毕设&课设&实训&大作业&竞赛&项目)

    项目工程资源经过严格测试运行并且功能上ok,可实现复现复刻,拿到资料包后可实现复现出一样的项目,本人系统开发经验充足(全栈全领域),有任何使用问题欢迎随时与我联系,我会抽时间努力为您解惑,提供帮助 【资源内容】:包含源码+工程文件+说明等。答辩评审平均分达到96分,放心下载使用!可实现复现;设计报告也可借鉴此项目;该资源内项目代码都经过测试运行,功能ok 【项目价值】:可用在相关项目设计中,皆可应用在项目、毕业设计、课程设计、期末/期中/大作业、工程实训、大创等学科竞赛比赛、初期项目立项、学习/练手等方面,可借鉴此优质项目实现复刻,设计报告也可借鉴此项目,也可基于此项目来扩展开发出更多功能 【提供帮助】:有任何使用上的问题欢迎随时与我联系,抽时间努力解答解惑,提供帮助 【附带帮助】:若还需要相关开发工具、学习资料等,我会提供帮助,提供资料,鼓励学习进步 下载后请首先打开说明文件(如有);整理时不同项目所包含资源内容不同;项目工程可实现复现复刻,如果基础还行,也可在此程序基础上进行修改,以实现其它功能。供开源学习/技术交流/学习参考,勿用于商业用途。质量优质,放心下载使用,资源为网络商品(电子资料类)基于网络商品和电子资料商品的性质和特征不支持退款,质量优质,放心下载使用

    MATLAB模态信号处理与小波阈值降噪的经典程序应用,Matlab小波阈值降噪与经典信号分解技术-模态降噪程序实践,matlab 小波阈值降噪,经典信号分解及降噪程序,模态 ,matlab;小波

    MATLAB模态信号处理与小波阈值降噪的经典程序应用,Matlab小波阈值降噪与经典信号分解技术——模态降噪程序实践,matlab 小波阈值降噪,经典信号分解及降噪程序,模态 ,matlab;小波阈值降噪;经典信号分解;模态降噪程序,MATLAB小波阈值降噪:经典信号分解与模态降噪程序

    “植屋”-网站设计 “植物”主题的网站,旨在科普一些植物培养、选种、购买的小知识 (html、css和js制作的静态网站).zip

    项目工程资源经过严格测试运行并且功能上ok,可实现复现复刻,拿到资料包后可实现复现出一样的项目,本人系统开发经验充足(全栈全领域),有任何使用问题欢迎随时与我联系,我会抽时间努力为您解惑,提供帮助 【资源内容】:包含源码+工程文件+说明等。答辩评审平均分达到96分,放心下载使用!可实现复现;设计报告也可借鉴此项目;该资源内项目代码都经过测试运行,功能ok 【项目价值】:可用在相关项目设计中,皆可应用在项目、毕业设计、课程设计、期末/期中/大作业、工程实训、大创等学科竞赛比赛、初期项目立项、学习/练手等方面,可借鉴此优质项目实现复刻,设计报告也可借鉴此项目,也可基于此项目来扩展开发出更多功能 【提供帮助】:有任何使用上的问题欢迎随时与我联系,抽时间努力解答解惑,提供帮助 【附带帮助】:若还需要相关开发工具、学习资料等,我会提供帮助,提供资料,鼓励学习进步 下载后请首先打开说明文件(如有);整理时不同项目所包含资源内容不同;项目工程可实现复现复刻,如果基础还行,也可在此程序基础上进行修改,以实现其它功能。供开源学习/技术交流/学习参考,勿用于商业用途。质量优质,放心下载使用,资源为网络商品(电子资料类)基于网络商品和电子资料商品的性质和特征不支持退款,质量优质,放心下载使用

Global site tag (gtag.js) - Google Analytics