程序设计艺术与方法》课程实验报告

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

《程序设计艺术与方法》课程实验报告

二实验名称搜索算法的实验

姓名系院专业信息工程

班级

物联网一

学号

实验日期指导教师成绩

一、实验目的和要求

1.掌握宽度优先搜索算法。

2.掌握深度优先搜索算法。

二、实验预习内容

1宽度优先搜索算法:又称广度优搜索。是最简单的图的算法的原形。其属于一种盲搜寻法,目的是系统地展开并检查图中的所有节点,以寻找结果。换句话说,它并不考虑结果的可能位址,彻底地搜索整张图,直到找到结果为止。

2深度优先搜索算法:它的目的是要达到被搜索结构的叶结点。在一个HTML文件中,当一个超链被选择后,被连接的HTML文件将执行深度优先搜索,即在搜索其余的超链走到不能再深入为止,然后返回到某一个HTML文件,再继续选择该HTML文件中的其他超链。当不再有其他超链可选择时,说明搜索已经结束。

三、实验项目摘要

1.将书上的走迷宫代码上机运行并检验结果,并注意体会搜索的思想。

2 .八皇后问题:

在一个国际象棋棋盘上放八个皇后,使得任何两个皇后之间不相互攻击,求出所有

的布棋方法。上机运行并检验结果。

思考:将此题推广到N 皇后的情况,检验在N 比较大的情况下,比方说N=16 的时

候,你的程序能否快速的求出结果,如果不能,思考有什么方法能够优化算法。

3骑士游历问题:

在国际棋盘上使一个骑士遍历所有的格子一遍且仅一遍,对于任意给定的顶点,

输出一条符合上述要求的路径。

4 倒水问题:

给定2 个没有刻度容器,对于任意给定的容积,求出如何只用两个瓶装出L 升

的水,如果可以,输出步骤,如果不可以,请输出No Solution。

四、实验结果与分析(源程序及相关说明)

2,八皇后问题:

#include

/*声明常量N存储行和列*/

#define N 8

#define NUM 8

/*声明全局变量,h[N][N]控制盘格,H[N][N]控制输出,n[N]存储每一步的*纵坐标,count用于计数。

*/

int h[N][N],n[N],H[N][N];

int count=0;

/*声明函数void tryit(int,int)尝试符合条件的方法*/

void tryit(int,int);

/*声明函数void outputArray(int[][N])输出数组*/

void outputArray(int[][N]);

main()

{

int x=0,y=0,i,j;

/*初始化为零*/

for(i=0;i<=N-1;i++)

{

for(j=0;j<=N-1;j++)

h[i][j]=0;

}

tryit(x,y);

printf("//其他的布局略\n");

printf("共有%d种布局.\n",92);

return(0);

}

/*定义函数void tryit(int,int)尝试符合条件的方法*/

void tryit(int x,int y)

{

int i,j;

if(count<=NUM)

{

/*重复时跳出递归*/

if((H[0][0]==1&&H[1][4]==1&&H[2][7]==1&&H[3][5]==1&&H[4][2]==1&&H[5][6 ]==1&&H[6][1]==1&&H[7][3]==1)&&count!=1)

{}

else

{

if(x>=0&&x<=N-1&&y>=0&&y<=N-1&&h[x][y]==0)

{

/*对与皇后在同一行、列、斜线上的点作出处理*/

for(j=0;j<=7;j++)

{

if(h[x][j]==0)

h[x][j]=x+1;

if(h[j][y]==0)

h[j][y]=x+1;

if(x+j>=0&&x+j<=N-1&&y+j>=0&&y+j<=N-1&&h[x+j][y+j]==0)

h[x+j][y+j]=x+1;

if(x+j>=0&&x+j<=N-1&&y-j>=0&&y-j<=N-1&&h[x+j][y-j]==0)

h[x+j][y-j]=x+1;

if(x-j>=0&&x-j<=N-1&&y+j>=0&&y+j<=N-1&&h[x-j][y+j]==0)

h[x-j][y+j]=x+1;

if(x-j>=0&&x-j<=N-1&&y-j>=0&&y-j<=N-1&&h[x-j][y-j]==0)

h[x-j][y-j]=x+1;

}

/*对皇后处的点作出标志*/

h[x][y]=-x-1;

/*完成一种走法作出处理*/

if(x==7)

{

/*转换成输出的格式*/

for(i=0;i<=N-1;i++)

{

for(j=0;j<=N-1;j++)

{

if(h[i][j]<0)

H[i][j]=1;

else

H[i][j]=0;

}

}

count=count+1;

/*输出前几种情况*/

if(count<=NUM)

{

printf("------布局%d------\n",count);

outputArray(H);

}

/*对下一种走法,清楚前一次的影响*/

for(i=0;i<=N-1;i++)

{

for(j=0;j<=N-1;j++)

{

if(h[i][j]==x||h[i][j]==-x||h[i][j]==-x-1)

h[i][j]=0;

}

}

相关文档
最新文档