3901130814肖翰算法实验报告5.docx
- 文档编号:7471487
- 上传时间:2023-01-24
- 格式:DOCX
- 页数:9
- 大小:159KB
3901130814肖翰算法实验报告5.docx
《3901130814肖翰算法实验报告5.docx》由会员分享,可在线阅读,更多相关《3901130814肖翰算法实验报告5.docx(9页珍藏版)》请在冰豆网上搜索。
3901130814肖翰算法实验报告5
算法分析与设计
实验报告
项目名称回溯算法
专业班级软件工程1303
学号3901130814
姓名肖翰
实验成绩:
批阅教师:
年月日
实验5《回溯算法》
实验学时:
2实验地点:
二综202实验日期:
2014..12.2
一、实验目的
1)通过实例理解深度优先策略和回溯机制。
2)用2-3个实例验证算法和时间复杂度。
二、实验内容
1)编程实现n皇后问题迭代回溯算法和递归算法。
三、实验方法
回溯法:
在包含问题的所有解的解空间树中,按照深度优先搜索的策略,从根结点出发深度探索解空间树。
当探索到某一结点时,要先判断该结点是否包含问题的解,如果包含,就从该结点出发继续探索下去,如果该结点不包含问题的解,则逐层向其祖先结点回溯。
(其实回溯法就是对隐式图的深度优先搜索算法)。
若用回溯法求问题的所有解时,要回溯到根,且根结点的所有可行的子树都要已被搜索遍才结束。
而若使用回溯法求任一个解时,只要搜索到问题的一个解就可以结束。
四、实验步骤
1、将第一个皇后放置在第一行的第一个空格里
2、对于第二行,从第一个空格开始寻找不与第一行的皇后冲突的空格。
找到的第一个不冲突的空格是第2个。
3、对于第三行,这时已经找不到与之前放置的两个皇后不冲突的空格了。
把当前行恢复初始状态,返回到上一行。
4、在当前行皇后所占的空格之后寻找一个不与之前皇后冲突的位置。
有两种情况,如果找打了则把当前行的皇后移动到该位置,然后处理下一行。
如果直到最后当前行的最后一个空格也没有找合适的位置,则把当前行恢复初始状态,继续回溯到上一行。
5、把最后一个皇后成功安置在最后一行,代表找到了一种可行解。
返回步骤4。
6、当需要回溯到第0行(表格之外)的时候代表已经找遍了所有可能的可行解。
代码:
非递归:
#include
usingnamespacestd;
intsum=0;//解的个数
//判断该位置是否可以
boolplace(intk,intx[]){
for(intj=1;j if((abs(k-j)==abs(x[k]-x[j]))||x[k]==x[j]){ returnfalse; } } returntrue; } //输出解 voidprint(intx[],intn){ cout< "; for(inti=1;i<=n;i++){ cout< } cout< } voidQueens(intn,intx[]){ intk=1; x[1]=0; while(k>0){ x[k]+=1; while((x[k]<=n)&&! (place(k,x))) x[k]+=1; if(x[k]<=n){ if(k==n){ sum++; print(x,n); } else{ k++; x[k]=0; } } else{ k--; } } } intmain(){ intn;//皇后的个数 cout<<"请输入皇后的个数: "; cin>>n; //每一列放皇后的位置 int*x=newint[n+1]; for(inti=0;i<=n;i++){ x[i]=0; } Queens(n,x); if(sum==0) cout< "< return0; } 递归: #include usingnamespacestd; intsum=0;//解的个数 //判断该位置是否可以 boolplace(intk,intx[]){ for(intj=1;j if((abs(k-j)==abs(x[k]-x[j]))||x[k]==x[j]){ returnfalse; } } returntrue; } //输出解 voidprint(intx[],intn){ cout< "; for(inti=1;i<=n;i++){ cout< } cout< } voidQueens(intt,intx[],intn){ if(t>n){ sum++; print(x,n); } else{ for(inti=1;i<=n;i++){ x[t]=i; if(place(t,x)) Queens(t+1,x,n); } } } intmain(){ intn;//皇后的个数 cout<<"请输入皇后的个数: "; cin>>n; //每一列放皇后的位置 int*x=newint[n+1]; for(inti=0;i<=n;i++){ x[i]=0; } Queens(1,x,n); if(sum==0) cout< "< return0; } 五、实验结果 非递归: 实例1: 实例2: 递归: 实例1: 实例2: 六、实验结论 从实验运行结果来看,无论是递归算法还是非递归算法,程序都能够很好地算出N皇后的解。 七、实验小结 通过这次实验,我明白了回溯法的基本思想,也了解N皇后的求解过程,由于实验难度不大,所以在完成实验的过程中,没有遇到太大的问题。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 3901130814 算法 实验 报告