3901130814肖翰算法实验报告5.docx

上传人:b****5 文档编号:7471487 上传时间:2023-01-24 格式:DOCX 页数:9 大小:159KB
下载 相关 举报
3901130814肖翰算法实验报告5.docx_第1页
第1页 / 共9页
3901130814肖翰算法实验报告5.docx_第2页
第2页 / 共9页
3901130814肖翰算法实验报告5.docx_第3页
第3页 / 共9页
3901130814肖翰算法实验报告5.docx_第4页
第4页 / 共9页
3901130814肖翰算法实验报告5.docx_第5页
第5页 / 共9页
点击查看更多>>
下载资源
资源描述

3901130814肖翰算法实验报告5.docx

《3901130814肖翰算法实验报告5.docx》由会员分享,可在线阅读,更多相关《3901130814肖翰算法实验报告5.docx(9页珍藏版)》请在冰豆网上搜索。

3901130814肖翰算法实验报告5.docx

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皇后的求解过程,由于实验难度不大,所以在完成实验的过程中,没有遇到太大的问题。

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

当前位置:首页 > 农林牧渔 > 林学

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

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