实验6迭代实现物联1301班刘悦08080112.docx

上传人:b****3 文档编号:2887763 上传时间:2022-11-16 格式:DOCX 页数:18 大小:237.24KB
下载 相关 举报
实验6迭代实现物联1301班刘悦08080112.docx_第1页
第1页 / 共18页
实验6迭代实现物联1301班刘悦08080112.docx_第2页
第2页 / 共18页
实验6迭代实现物联1301班刘悦08080112.docx_第3页
第3页 / 共18页
实验6迭代实现物联1301班刘悦08080112.docx_第4页
第4页 / 共18页
实验6迭代实现物联1301班刘悦08080112.docx_第5页
第5页 / 共18页
点击查看更多>>
下载资源
资源描述

实验6迭代实现物联1301班刘悦08080112.docx

《实验6迭代实现物联1301班刘悦08080112.docx》由会员分享,可在线阅读,更多相关《实验6迭代实现物联1301班刘悦08080112.docx(18页珍藏版)》请在冰豆网上搜索。

实验6迭代实现物联1301班刘悦08080112.docx

实验6迭代实现物联1301班刘悦08080112

算法分析与设计实验报告

第6次实验

姓名

刘悦

学号

201308080112

班级

物联1301班

时间

12.12上午

地点

工训楼C栋309

实验名称

回溯法实验(八皇后问题)

实验目的

1)掌握回溯法求解问题的思想。

2)学会利用其原理求解相关问题。

实验原理

使用迭代实现回溯法。

从第一行开始放置皇后,第一行从第一列开始放置。

之后放置第二行,与已放置的皇后冲突的位置不再考虑。

之后再放置后面行的皇后,一旦某一行无位置可放,就退回到上一行,选择后面的其他位置进行放置。

之后再重复上面的过程。

一旦到达最后一行,就求得了解,记录这个时候的放置的信息。

实验步骤

1放置第一行的皇后。

2放置后面行的皇后,与已放置的皇后在同一直线、横线、斜线的位置不能放置。

3放置后面的皇后。

一旦某一行无位置可放,就返回到上面一行,选择其他位置放置皇后。

4一旦到达最后一行,意味着找到了一个可行解,就记录这个放置方案。

5重复过程,直至找到所有可能的放置解。

关键代码

/*=================================================================

定义Queen类来存储皇后的信息。

=================================================================*/

classQueen

{

friendintnQueen(int);

private:

boolPlace(intk);

voidBacktrack(void);

intn;//皇后个数

int*x;//当前解

longsum;//当前已找到的可行方案数

};

 

/*=================================================================

Place函数进行可行性约束。

若当前的位置已经与之前放置的皇后位置冲突,返回false;否则返回true。

若两皇后的斜率为-1或1则表示在同一斜线上就冲突,返回false。

*******************************************************************

k表示当前放置的皇后的行数。

x[k]表示第k行皇后放置的列数。

即第k个皇后放在第x[k]列。

=================================================================*/

boolQueen:

:

Place(intk)

{

for(intj=1;j

//abs(k-j)==abs(x[j]-x[k])时,两皇后在同一斜线上

if((abs(k-j)==abs(x[j]-x[k]))||(x[j]==x[k]))

returnfalse;

returntrue;

}

 

/*=================================================================

Backtrack函数迭代求皇后放置的位置。

如果已经放完最后一行,就将放置方案数加一,并将各个皇后放置的位置输出到记事本中

否则,就找一个可以放置的位置,然后进行下一行的放置。

这里使用迭代实现,使用k来记录当前的行数

如果某一行无位置可放,将回溯到前面一行,即k--,选择其他位置放置皇后。

*******************************************************************

k表示当前放置的皇后的行数。

x[k]表示第k行皇后放置的列数。

即第k个皇后放在第x[k]列。

=================================================================*/

voidQueen:

:

Backtrack(void)

{

x[1]=0;

intk=1;

while(k>0)

{

x[k]+=1;//第k行的放置皇后为第一列

//如果不满足约束条件就继续找后面一列看是否可放皇后

while((x[k]<=n)&&!

(Place(k)))

x[k]+=1;

//当前行有位置可放

if(x[k]<=n)

//已经放完最后一行的皇后

if(k==n)

{

sum++;//找到的放置方案数+1

//将具体放置方案写到记事本文件【N皇后_迭代.txt】中

staticofstreamfout("N皇后_迭代.txt");

fout<<"第"<

"<

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

{

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

{

if(j==x[i])

fout<<"x";//x表示皇后放置的位置

elsefout<<"*";//*表示没有放置皇后的位置

}

fout<

}

}

//没有放完最后一行

else

{

k++;//继续放下一行

x[k]=0;//下一行刚开始为0位置,这样循环之后+1就可以从第1列开始看

}

//没有位置可放,就回溯到前面一行

elsek--;

}

}

 

/*=================================================================

nQueen函数进行初始化,并方案数目返回。

主要为调用Backtrack函数。

******************************************************************

n表示皇后数。

=================================================================*/

intnQueen(intn)

{

QueenX;

//初始化X

X.n=n;

X.sum=0;

int*p=newint[n+1];

for(inti=0;i<=n;i++)

p[i]=0;

X.x=p;

//调用函数

X.Backtrack();

//删除动态分配内存

delete[]p;

returnX.sum;

}

测试结果

Ø8皇后

记事本中的结果如上所示。

可以看到实现了方案的输出。

8皇后问题的时候,算法的时间不如之前的写过的算法的性能好,这里主要是因为,在算法中实现了将结果写入到记事本中,浪费了很多时间。

Ø9皇后

Ø10皇后

Ø11皇后

Ø12皇后

Ø13皇后

可以清楚的发现,N皇后问题,皇后越多,时间越多,当13皇后的时候这个时间已经非常大了,这里是因为算法实现的过程中要找到所有的情况,要将树全部遍历晚,皇后数目越多的时候树的结点就越多,遍历越慢,所以耗费很长时间。

与前面的递归实现相比,对应的N皇后的时间都差不多的,就是最后13皇后的时候,迭代实现比递归实现慢的很明显。

实验心得

因为前面已经使用递归实现了回溯法求N皇后问题,使用迭代实现的思路与使用递归实现的思路是一样的,代码的大体框架都是类似的,所以编写过程中没有什么大问题。

这里主要是写一下迭代的代码来看一下区别。

写完之后可以发现,其实思路都是一样的。

递归的话,因为只要调用函数自身,传一个层数的参数进去就可以,所以代码显得十分简洁。

但是就我们本身来说,看到一个完全不知道什么编写思路的代码如果使用了递归的话,我们理解起来可能会很有难度。

我个人认为递归的代码实现比较容易出错。

迭代的话,看到代码会很容易读懂,但是会要增加另外的变量来表示到了哪一层,就会使代码显得比较冗长。

就我个人来说,我一般喜欢写递归的实现,因为我是在已知思路的情况下进行代码编写,所以递归实现起来并不难。

实验得分

助教签名

附录:

完整代码

 

#include

#include

#include

#include

#include

#include

usingnamespacestd;

/*============================================================================

定义Queen类来存储皇后的信息。

============================================================================*/

classQueen

{

friendintnQueen(int);

private:

boolPlace(intk);

voidBacktrack(void);

intn;//皇后个数

int*x;//当前解

longsum;//当前已找到的可行方案数

};

/*============================================================================

Place函数进行可行性约束。

若当前的位置已经与之前放置的皇后位置冲突,返回false;否则返回true。

若两皇后的斜率为-1或1则表示在同一斜线上就冲突,返回false。

******************************************************************************

k表示当前放置的皇后的行数。

x[k]表示第k行皇后放置的列数。

即第k个皇后放在第x[k]列。

============================================================================*/

boolQueen:

:

Place(intk)

{

for(intj=1;j

//abs(k-j)==abs(x[j]-x[k])时,两皇后在同一斜线上

if((abs(k-j)==abs(x[j]-x[k]))||(x[j]==x[k]))

returnfalse;

returntrue;

}

/*============================================================================

Backtrack函数迭代求皇后放置的位置。

如果已经放完最后一行,就将放置方案数加一,并将各个皇后放置的位置输出到记事本中

否则,就找一个可以放置的位置,然后进行下一行的放置。

这里使用迭代实现,使用k来记录当前的行数

如果某一行无位置可放,将回溯到前面一行,即k--,选择其他位置放置皇后。

*******************************************************

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

当前位置:首页 > PPT模板 > 艺术创意

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

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