n皇后实验报告.docx

上传人:b****7 文档编号:9834560 上传时间:2023-02-06 格式:DOCX 页数:7 大小:70.54KB
下载 相关 举报
n皇后实验报告.docx_第1页
第1页 / 共7页
n皇后实验报告.docx_第2页
第2页 / 共7页
n皇后实验报告.docx_第3页
第3页 / 共7页
n皇后实验报告.docx_第4页
第4页 / 共7页
n皇后实验报告.docx_第5页
第5页 / 共7页
点击查看更多>>
下载资源
资源描述

n皇后实验报告.docx

《n皇后实验报告.docx》由会员分享,可在线阅读,更多相关《n皇后实验报告.docx(7页珍藏版)》请在冰豆网上搜索。

n皇后实验报告.docx

n皇后实验报告

n皇后实验报告

实验报告

实验名称n皇后问题

课程名称计算机算法设计与分析

专业班级:

学生姓名:

学号:

成绩:

指导老师:

实验日期:

a)x[i]≠x[j],i≠j:

不允许将任何两个皇后放在同一列上;

b)|j-i|≠|x[j]-x[i]|:

不允许两个皇后位于同一条斜线上。

问题的解空间的形式为:

要找出”四皇后”问题的解,最可靠的方法就是把各种情况全部检核一遍,将符合条件A的解找出来。

但这样做,你要有相当耐心才行,这是很费时的。

采用回溯算法进行求解,在搜索的过程中,将不满足条件要求的分支树减去,可以有效的降低算法的时间复杂性。

n后问题的算法描述如下:

剪枝函数:

boolOk(intt)

{

inti;

for(inti=0;i

if(x[t]==x[i]||abs(t-i)==abs(x[t]-x[i]))

return0;

}

return1;

}

voidBacktrack(intt)

{

if(t>=n){

cout<<"第"<

\n";

for(inti=1;i<=n;i++){

for(intj=1;j<=n;j++){

if(j==x[i])

cout<<"1";

else

cout<<"0";

}

cout<

}

sum++;

}

else{

for(inti=0;i

x[t]=i;

if(Ok(t))

Backtrack(t+1);

}

}

}

一、实验结果

五、实验代码

#include

usingnamespacestd;

int*x;//当前解

intn;//皇后的个数N

intsum=1;

boolOk(intt)//检查参数所指示的这一行皇后放置方案是否满足要求

{

inti;

for(inti=0;i

if(x[t]==x[i]||abs(t-i)==abs(x[t]-x[i]))

return0;

}

return1;

}

voidBacktrack(intt)

{

if(t>=n){

cout<<"第"<

\n";

for(inti=1;i<=n;i++){

for(intj=1;j<=n;j++){

if(j==x[i])

cout<<"1";

else

cout<<"0";

}

cout<

}

sum++;

}

else{

for(inti=0;i

x[t]=i;

if(Ok(t))

Backtrack(t+1);

}

}

}

voidmain()

{

cout<<"输入皇后个数:

";

cin>>n;

x=(int*)malloc(sizeof(int)*n);

Backtrack(0);

cout<<"一共的方案数为:

"<

system("pause");

}

 

六、实验心得

通过本次实验的学习,让我了解到了用回溯法可以搜索问题的所有解。

它是一个既带有系统性又带有跳跃性的搜索算法,是按照深度优先策略,从根节点出发搜索解空间树。

算法搜索至某一节点时,利用判断函数先判断该节点内是否包含问题的解,如果不包含则直接跳过,节省时间。

相关的判断函数要根据实际问题来编写,此比较适合求解组合数较大的问题。

 

总的来说,这次实验不仅让我基本掌握递归的思想,而且进一步提高了自己的自学能力和编程能力,使我对算法的分析与设计有更深刻的认识。

程序不是一时之事,需要长时间的积累,逐步付诸实践才能真正的掌握,我会继续努力学习,争取做得更好。

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 总结汇报 > 学习总结

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1