n皇后实验报告.docx
- 文档编号:9834560
- 上传时间:2023-02-06
- 格式:DOCX
- 页数:7
- 大小:70.54KB
n皇后实验报告.docx
《n皇后实验报告.docx》由会员分享,可在线阅读,更多相关《n皇后实验报告.docx(7页珍藏版)》请在冰豆网上搜索。
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"); } 六、实验心得 通过本次实验的学习,让我了解到了用回溯法可以搜索问题的所有解。 它是一个既带有系统性又带有跳跃性的搜索算法,是按照深度优先策略,从根节点出发搜索解空间树。 算法搜索至某一节点时,利用判断函数先判断该节点内是否包含问题的解,如果不包含则直接跳过,节省时间。 相关的判断函数要根据实际问题来编写,此比较适合求解组合数较大的问题。 总的来说,这次实验不仅让我基本掌握递归的思想,而且进一步提高了自己的自学能力和编程能力,使我对算法的分析与设计有更深刻的认识。 程序不是一时之事,需要长时间的积累,逐步付诸实践才能真正的掌握,我会继续努力学习,争取做得更好。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 皇后 实验 报告