DS选1迷宫求解.docx
《DS选1迷宫求解.docx》由会员分享,可在线阅读,更多相关《DS选1迷宫求解.docx(11页珍藏版)》请在冰豆网上搜索。
DS选1迷宫求解
课程实验报告
项目名称:
栈的操作(迷宫求解)
学生姓名:
学生学号:
指导教师:
完成日期:
【实验目的】
1.理解堆栈的逻辑特性和存储特性
2.掌握堆栈的常用操作解决实际应用问题的方法
【实验前分析】
由于计算机解迷宫时,通常用的是“穷举求解”的方法,即从入口出发,顺一方向向前探索,若能走通,则继续往前走;否则沿原路返回,换一个方向再继续探索,直到所有可能的通路都探索到为止。
为了保证在任何位置上都能沿原路返回,显然需要用一后进先出的结构来保存从入口到当前位置的路劲。
因此,在求迷宫通路的算法中应用“栈”也就是自然而然的事了。
【实验内容】
1.设计一个二维迷宫
2.求解从迷宫入口到出口的路径
【实验方式】
个人实验
【实验设备与环境】
PC机,WindowsXP操作系统,VC++6.0开发环境。
【数据结构及函数定义】
(1)主函数main()实现初始化操作,完成对子函数的调用
voidmain()
{inti,m,n,cycle=0;
while(cycle!
=(-1))
{
printf("欢迎使用迷宫求解程序\n");
printf("设计者:
张安\n");
printf("*手动生成迷宫请按:
1\n");
printf("*自动生成迷宫请按:
2\n");
printf("*退出请按:
3\n\n");
printf("\n");
printf("请选择你的操作:
\n");
scanf("%d",&i);
switch(i)
{case1:
printf("\n请输入行数:
");scanf("%d",&m);
printf("\n");
printf("请输入列数:
");scanf("%d",&n);
while((m<=0||m>39)||(n<=0||n>39))
{printf("\n抱歉,你输入的行列数超出预设范围(0-39,0-39),请重新输入:
\n\n");
printf("请输入行数:
");scanf("%d",&m);
printf("\n");
printf("请输入列数:
");scanf("%d",&n);
}
shoudong_maze(m,n);
print_maze(m,n);
mgpath(maze,m,n);
if(X!
=0)result_maze(m,n);
printf("\n\nPressEnterContiue!
\n");getchar();while(getchar()!
='\n');break;
case2:
printf("\n请输入行数:
");scanf("%d",&m);
printf("\n");
printf("请输入列数:
");scanf("%d",&n);
while((m<=0||m>39)||(n<=0||n>39))
{printf("\n抱歉,你输入的行列数超出预设范围(0-39,0-39),请重新输入:
\n\n");
printf("请输入行数:
");scanf("%d",&m);
printf("\n");
printf("请输入列数:
");scanf("%d",&n);
}
zidong_maze(m,n);
print_maze(m,n);
mgpath(maze,m,n);
if(X!
=0)result_maze(m,n);
printf("\n\nPressEnterContiue!
\n");getchar();while(getchar()!
='\n');break;
case3:
cycle=(-1);break;
default:
printf("\n");printf("你的输入有误!
\n");
printf("\nPressEnterContiue!
\n");getchar();while(getchar()!
='\n');break;
}
}
}
(2)子函数
voidshoudong_maze(intm,intn)//手动生成迷宫函数
voidzidong_maze(intm,intn)//自动生成迷宫函数
voidzidong_maze(intm,intn)//将迷宫打印成图形
voidresult_maze(intm,intn)//若存在迷宫路径就打印迷宫路径函数
voidenqueue(structpointp)//入队列函数
structpointdequeue()//出队列函数
intis_empty()//判断队列是否为空函数
voidvisit(introw,intcol,intmaze[41][41])//访问节点函数
intmgpath(intmaze[41][41],intm,intn)//搜索路径函数
【测试数据与实验结果】
(请用截图的方式展示实验结果,并辅以必要的文字说明)
(1)选择1手动生成迷宫:
(2)选择2自动生成迷宫:
【源程序清单】
(请附上源程序)
……………………………………
……………………………………
……………………………………
源程序:
#include"stdlib.h"
#include"stdio.h"
#defineN39
#defineM39
intX;
intmaze[N+2][M+2];
structpoint{
introw,col,predecessor;
}queue[512];
inthead=0,tail=0;
voidshoudong_maze(intm,intn){
inti,j;
printf("\n\n");
printf("请按行输入迷宫,0表示通路,1表示障碍:
\n\n");
for(i=0;ifor(j=0;jscanf("%d",&maze[i][j]);
}
voidzidong_maze(intm,intn){
inti,j;
printf("\n迷宫生成中……\n\n");
system("pause");
for(i=0;ifor(j=0;jmaze[i][j]=rand()%2;
//由于rand()产生的随机数是从0到RAND_MAX
//RAND_MAX是定义在stdlib.h中的,其值至少为32767)
//要产生从X到Y的数,只需要这样写:
k=rand()%(Y-X+1)+X;
}
voidprint_maze(intm,intn){
inti,j;
printf("\n迷宫生成结果如下:
\n\n");
printf("迷宫入口\n");
printf("↓");
for(i=0;i{printf("\n");
for(j=0;j{if(maze[i][j]==0)printf("□");
if(maze[i][j]==1)printf("■");}
}
printf("→迷宫出口\n");
}
voidresult_maze(intm,intn){
inti,j;
printf("迷宫通路(用☆表示)如下所示:
\n\t");
for(i=0;i{printf("\n");
for(j=0;j{if(maze[i][j]==0||maze[i][j]==2)printf("□");
if(maze[i][j]==1)printf("■");
if(maze[i][j]==3)printf("☆");
}
}
}
voidenqueue(structpointp){
queue[tail]=p;
tail++;
}
structpointdequeue(){
head++;
returnqueue[head-1];
}
intis_empty(){
returnhead==tail;
}
voidvisit(introw,intcol,intmaze[41][41]){
structpointvisit_point={row,col,head-1};
maze[row][col]=2;
enqueue(visit_point);
}
intmgpath(intmaze[41][41],intm,intn){
X=1;
structpointp={0,0,-1};
if(maze[p.row][p.col]==1)
{printf("\n\n");
printf("此迷宫无解\n\n");X=0;return0;}
maze[p.row][p.col]=2;
enqueue(p);
while(!
is_empty())
{p=dequeue();
if((p.row==m-1)&&(p.col==n-1))break;
if((p.col+1if((p.row+1if((p.col-1>=0)&&(maze[p.row][p.col-1]==0))visit(p.row,p.col-1,maze);
if((p.row-1>=0)&&(maze[p.row-1][p.col]==0))visit(p.row-1,p.col,maze);
}
if(p.row==m-1&&p.col==n-1)
{printf("\n\n");
printf("迷宫路径为:
\n");
printf("(%d,%d)\n",p.row,p.col);
maze[p.row][p.col]=3;
while(p.predecessor!
=-1)
{p=queue[p.predecessor];
printf("(%d,%d)\n",p.row,p.col);
maze[p.row][p.col]=3;
}
}
else{printf("\n\n");
printf("此迷宫无解!
\n\n");X=0;}
return0;
}
voidmain()
{inti,m,n,cycle=0;
while(cycle!
=(-1))
{
printf("\n");
printf("欢迎使用迷宫求解程序\n");
printf("设计者:
张安\n");
printf("\n");
printf("*手动生成迷宫请按:
1\n");
printf("*自动生成迷宫请按:
2\n");
printf("*退出请按:
3\n\n");
printf("\n");
printf("\n");
printf("请选择你的操作:
\n");
scanf("%d",&i);
switch(i)
{case1:
printf("\n请输入行数:
");scanf("%d",&m);
printf("\n");
printf("请输入列数:
");scanf("%d",&n);
while((m<=0||m>39)||(n<=0||n>39))
{printf("\n抱歉,你输入的行列数超出预设范围(0-39,0-39),请重新输入:
\n\n");
printf("请输入行数:
");scanf("%d",&m);
printf("\n");
printf("请输入列数:
");scanf("%d",&n);
}
shoudong_maze(m,n);
print_maze(m,n);
mgpath(maze,m,n);
if(X!
=0)result_maze(m,n);
printf("\n\nPressEnterContiue!
\n");getchar();while(getchar()!
='\n');break;
case2:
printf("\n请输入行数:
");scanf("%d",&m);
printf("\n");
printf("请输入列数:
");scanf("%d",&n);
while((m<=0||m>39)||(n<=0||n>39))
{printf("\n抱歉,你输入的行列数超出预设范围(0-39,0-39),请重新输入:
\n\n");
printf("请输入行数:
");scanf("%d",&m);
printf("\n");
printf("请输入列数:
");scanf("%d",&n);
}
zidong_maze(m,n);
print_maze(m,n);
mgpath(maze,m,n);
if(X!
=0)result_maze(m,n);
printf("\n\nPressEnterContiue!
\n");getchar();while(getchar()!
='\n');break;
case3:
cycle=(-1);break;
default:
printf("\n");printf("你的输入有误!
\n");
printf("\nPressEnterContiue!
\n");getchar();while(getchar()!
='\n');break;
}
}
}
【实验后总结与体会】
该实验内容丰富,所涉及到的知识面很广,我通过查阅多种书籍经过一周时间的准备并读过很多别人写的关于迷宫求解的程序,才勉强完成了这一份实验报告,当然这使我受益匪浅,虽然这花费了我很多的时间在这上面,但我并不亏,因为我又见了许多关于栈的操作,加深了对知识的巩固和理解。
上课纪律(20%)
实验过程及结果(40%)
实验报告质量(40%)
总分:
教师签字: