完整word版实验报告迷宫问题.docx

上传人:b****5 文档编号:11747128 上传时间:2023-03-31 格式:DOCX 页数:10 大小:50.04KB
下载 相关 举报
完整word版实验报告迷宫问题.docx_第1页
第1页 / 共10页
完整word版实验报告迷宫问题.docx_第2页
第2页 / 共10页
完整word版实验报告迷宫问题.docx_第3页
第3页 / 共10页
完整word版实验报告迷宫问题.docx_第4页
第4页 / 共10页
完整word版实验报告迷宫问题.docx_第5页
第5页 / 共10页
点击查看更多>>
下载资源
资源描述

完整word版实验报告迷宫问题.docx

《完整word版实验报告迷宫问题.docx》由会员分享,可在线阅读,更多相关《完整word版实验报告迷宫问题.docx(10页珍藏版)》请在冰豆网上搜索。

完整word版实验报告迷宫问题.docx

完整word版实验报告迷宫问题

实习2栈的应用

本次实习的主要目的在于帮助学生深入了解栈的特性,以便在实际问题背景下灵活运用他们;同时还将巩固对栈这种结构的构造方法的理解。

实验课时  6课时

程序1:

迷宫问题

[问题描述]

以一个m×n的长方阵表示迷宫,‘0’和‘1’分别表示迷宫中的通路和障碍。

设计一个程序,对任意设定的迷宫,求出一条从入口到出口的通路,或得出没有通路的结论。

[基本要求]

首先实现一个以顺序表或链表做存储结构的栈类型,然后编写一个求解迷宫的非递归程序。

求得的通路以三元组(i,j,d)的形式输出,其中:

(i,j)指示迷宫中的一个坐标,d表示走到下一坐标的方向。

如:

对下列数据的迷宫,输出的一条通路为:

(1,1,1),(1,2,2),(2,2,2),…

[测试数据]

迷宫的测试数据如下:

左上角(1,1)为入口,右下角(3,4)为出口。

 

[实现提示]

计算机解迷宫通常用的是“穷举求解”方法,即从入口出发,顺着某一个方向进行探索,若能走通,则继续往前进;否则沿原路退回,换一个方向再继续探索,直至所有可能的通路都探索到为止,如果所有可能的通路都试探过,还是不能走到终点,那就说明该迷宫不存在从起点到终点的通道,可以二维数组存储迷宫数据。

[程序实现]

#include

#include

//1.迷宫位置坐标类型

typedefstruct

{

intx;//行

inty;//列

}PosType;

#defineMAXENGTH25//迷宫最大行列数位25

typedefintMazeType[MAXENGTH][MAXENGTH];//迷宫数列

typedefstruct//定义栈

{

intord;//通道块在路径上的序号

PosTypeseat;//通道块在迷宫中的位置

intdi;//走向下一块的方向(0~3表示东、南、西、北)

}SElemType;

//2.全局变量

MazeTypem;//迷宫数组

intcurstep=1;//当前位置,初值为1

#defineSTACK_INIT_SIZE10//存储空间初始分配量

#defineSTACKINCREMENT2//存储空间分配增量

//3.栈的顺序存储表示

typedefstructSqStack

{

SElemType*base;//尾指针

SElemType*top;//头指针

intstacksize;//栈大小

}SqStack;//顺序表

//4.构造空栈

intInitStack(SqStack&S)

{

S.base=(SElemType*)malloc(STACK_INIT_SIZE*sizeof(SElemType));

if(!

(S.base))

exit(0);

S.top=S.base;

S.stacksize=STACK_INIT_SIZE;

return1;

}

//5.判断栈是否为空(用来判断迷宫是否不可达到出口)

intStackEmpty(SqStackS)

{

if(S.top==S.base)//栈底与栈顶相等为空栈

return1;

else

return0;

}

//6.插入元素

intPush(SqStack&S,SElemTypee)

{

if(S.top-S.base>=S.stacksize)//栈顶-栈底>=栈长,说明空间已满

{

S.base=(SElemType*)realloc(S.base,(S.stacksize+STACKINCREMENT)*sizeof(SElemType));

if(!

S.base)

exit(0);

S.top=S.base+S.stacksize;

S.stacksize+=STACKINCREMENT;

}

*(S.top)++=e;

return1;

}

//7.栈不为空时,删除栈顶元素,用e返回(用于当栈顶元素各方向均不通时,将其从路径中删除)

intPop(SqStack&S,SElemType&e)

{

if(S.top==S.base)

return0;

e=*--S.top;//先将S.top的值赋给e,再将S.top向下移一位

return1;

}

//8.判断迷宫m中b点是否可通过(是1,否0),其中墙为0,可通过路径为1,不可通过路径为-1

intPass(PosTypeb)

{

if(m[b.x][b.y]==1)

return1;

else

return0;

}

//9.是迷宫m中a的序号变为足迹(即该位置目前可通过)

voidFootPrint(PosTypea)

{

m[a.x][a.y]=curstep;

}

//10.根据当前位置方向,返回下一位置

PosTypeNextPos(PosTypec,intdi)

{

PosTypedirec[4]={{0,1},{1,0},{0,-1},{-1,0}};

c.x+=direc[di].x;

c.y+=direc[di].y;

returnc;

}

//11.道路不能通过时(即为死路),将其标记为-1

voidMarkPrint(PosTypeb)

{

m[b.x][b.y]=-1;

}

//12.求迷宫出口

intMazePath(PosTypestart,PosTypeend)

{

SqStackS;

PosTypecurpos;//当前位置

SElemTypee;

InitStack(S);

curpos=start;

do

{

if(Pass(curpos))

{

FootPrint(curpos);

e.ord=curstep;

e.seat.x=curpos.x;

e.seat.y=curpos.y;

e.di=0;

Push(S,e);

curstep++;

if(curpos.x==end.x&&curpos.y==end.y)

return1;

curpos=NextPos(curpos,e.di);

}

else

{

if(!

StackEmpty(S))

{

Pop(S,e);

curstep--;

while(e.di==3&&!

StackEmpty(S))

{

MarkPrint(e.seat);

Pop(S,e);

curstep--;

}

if(e.di<3)

{

e.di++;

Push(S,e);

curstep++;

curpos=NextPos(e.seat,e.di);

}

}

}

}while(!

StackEmpty(S));

return0;

}

//13.输出迷宫结构

voidPrint(intx,inty)

{

inti,j;

for(i=0;i

{

for(j=0;j

printf("%3d",m[i][j]);

printf("\n");

}

}

//14.主函数

intmain()

{

PosTypebegin,end;

inti,j,x,y,x1,y1;

printf("请输入迷宫行列数(包括外墙):

(空格隔开)\n");

scanf("%d%d",&x,&y);

for(i=0;i

{

m[0][i]=0;

m[x-1][i]=0;

}

for(j=0;j

{

m[j][0]=0;

m[j][y-1]=0;

}

for(i=1;i

for(j=1;j

m[i][j]=1;//墙内初始值均为1

//输入迷宫中墙的个数

printf("输入墙的个数:

");

scanf("%d",&j);

//安排墙的位置

printf("请输入墙的位置(坐标),用空格隔开:

\n");

for(i=1;i<=j;i++)

{

scanf("%d%d",&x1,&y1);

m[x1][y1]=0;

}

printf("迷宫结构如下\n");

Print(x,y);

printf("请输入起点坐标:

\n");

scanf("%d%d",&begin.x,&begin.y);

printf("请输入终点坐标:

\n");

scanf("%d%d",&end.x,&end.y);

if(MazePath(begin,end))

{

printf("此迷宫的一条路径如下:

\n");

Print(x,y);

}

else

printf("此迷宫无法到达出口\n");

return0;

}

[实验结果]

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

当前位置:首页 > 自然科学 > 数学

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

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