- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
算法分析与设计实验报告 第 三 次附加实验
姓名
学号
班级
时间
12.26 上午
地点
工训楼 309
实验名称
回溯法实验(n 皇后问题)(迭代法)
实验目的
1. 掌握回溯法求解问题的思想
2. 学会利用其原理求解相关问题
实验原理
用 n 元组 x[1:n]表示 n 后问题的解。其中,x[i]表示皇后 i 放在棋盘的第 i 行的第 x[i]列。由于不允许将 2 个皇后放在同一列上,所以解向量中的 x[i] 互不相同。2 个皇后不能放在同一斜线上是问题的隐形约束。
用回溯法解 n 后问题时,用完全 n 叉树表示解空间。可行性约束 Place 剪出 不满足行、列和斜线约束的子树。
递归函数 Backtrack(1)实现对整个解空间的回溯搜索。 Backtrack(i)搜索 解空间中第 i 层子树。类 Queen 的数据成员记录解空间中结点信息,以减少 传给 Backtrack 的参数。Sum 记录当前已找到的可行方案数。
实验步骤
数组法:
(1)根据 n 皇后问题,可以把其设想为一个数组;
(2)根据 n 皇后的规则,可以设想为数组上同一直线,横线,斜线的数字都 不能相同,由此可以得到判断条件;
(3)根据判断条件之后,建立回溯点,即可解决问题。
堆栈法:
(1) 检索当前行是否可以放置一个皇后;
(2) 利用检索过程,通过递归的方式,来确定每一个皇后的位置。
递归回溯:
void Queen::Backtrack(int t)
{
if(tn)
{
sum++;
/*for(int i=1;i=n;i++) //输出皇后排列的解 {
coutx[i] ;
}
coutendl;*/
}
else
{//回溯探索第i行的每一列是否有元素满足要求
for(int i=1;i=n;i++)
{
x[t]=i;
if(Place(t))
{
Backtrack(t+1);
}
}
}
}
迭代回溯:
void Queen::Backtrack() //迭代法实现回溯函数
{
x[1] = 0;
int k = 1;
while(k0)
{
x[k] += 1; //先将皇后放在第一列的位置上
while((x[k]=n)!(Place(k))) //寻找能够放置皇后的 位置
{ x[k] += 1; }
if(x[k]=n) //找到位置
{
if(k == n) //如果寻找结束输出结果
{
/*for (int i=1;i=n;i++)
{ coutx[i] ; }
coutendl; */
sum++;
}
else //没有结束则找下一行
{
k++;
x[k]=0;
}
}
else //没有找到合适的位置则回溯
{ k--; }
}
}
测试
测试结果
较小皇后个数结果:
递归法较大的皇后个数:
迭代法较大的皇后个数:
输入较大的皇后个数 15:
输入皇后个数是 16 时:
当输入的皇后个数是 20 时:
运行了一个上午都没有出结果,所以果断放弃了。
实验分析
在上述的实验结果中:
(1) 我们可以观察到输出皇后排序结果与不输出结果,只输出解的个数是有 差距的。
(2) 而且通过对比递归与迭代两种不同的实现方法,发现情况是基本相同的, 时间上并没有什么太大的差距,但是相对的迭代会稍微快一点点。
(3) 然后对比输入较大的皇后个数之后,仅仅一个皇后之差就会使得时间上 相差很大,如 15 个皇后的时候所用的时间是 280.102,而当皇后个数是 16 时,所用的时间是 2153.463,从而我们可以看出 n 皇后问题的时间复杂度是 指数级的,从而 n 皇后问题确实是 NP 问题。
实验心得
Dijkstra 算法在之前的数据结构中就学过,在当时只是学过这种思想,并没 有去深思这种思想其背后到底是一种怎样的思想在里面。后来经过本门课的 学习,对于贪心算法有了更深刻的了解,也知道了如何利用贪心算法去解决 问题。最开心的是经过一定时间的练习,我的编程能力有了一定的提高,之 前看见就很头疼的问题,现在也能静下心来去思考,而且实现 Dijkstra 算法 也可以通过一定程度的思考也能写出来了,感觉还是很开心的。Dijkstra 算 法求单源最短路径在很多地方都有应用,经过一次又一次的练习,终于能好 好的掌握这一算法了,还是希望不要那么快忘记啊。
实验得分
助教签名
附录:
完整代码(回溯法)
//回溯算法
递归回溯 n皇后问题
#includeiostream
#includetime.h
#includeiomanip
#includemath.h
using namespace std;
class Queen
{
friend int nQueen(int); private:
//定义友元函数,可以访问私有
您可能关注的文档
最近下载
- 阿法拉伐分油机中文说明Instruction book1.pdf VIP
- 《Java程序设计》教案(思政版).docx VIP
- 四年级上册数学《三位数乘两位数的笔算乘法》(共18张PPT).pptx VIP
- AWS B4.0-2016 焊缝机械测试的标准方法(中文版).pdf
- 《绩效与薪酬管理》课程教学大纲(中文).docx VIP
- 国开电大学习网网络安全技术形考任务答案.pdf VIP
- 成长赛道飞机机电设备维修专业1500字.pptx VIP
- 从业人员食品安全知识培训计划及培训考核记录.docx VIP
- GB50641-2010 有色金属矿山井巷安装工程施工规范.docx VIP
- 胃癌根治术的手术护理查房2讲课文档.ppt VIP
文档评论(0)