程序设计艺术与方法》课程实验报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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;
}
}