迷宫c程序代码.docx
- 文档编号:24141159
- 上传时间:2023-05-24
- 格式:DOCX
- 页数:9
- 大小:15.74KB
迷宫c程序代码.docx
《迷宫c程序代码.docx》由会员分享,可在线阅读,更多相关《迷宫c程序代码.docx(9页珍藏版)》请在冰豆网上搜索。
迷宫c程序代码
#include
#include
#defineoverflow-1
#defineok1
#defineerror0
#defineSTACK_INIT_SIZE100
#defineSTACKINCREMENT10
typedefintStatus;
typedefstruct
{
intx;
inty;
}PosType;//位置类型
typedefstruct
{
introw,col;
inta[50][50];
}MazeType;//迷宫类型
typedefstruct
{
intord;//通道块在路径上的序号
PosTypeseat;//通道块在迷宫中的“坐标位置”
intdi;//从此通道块走向下一个通道块的方向
}SElemType;//栈的元素类型
typedefstruct
{
SElemType*base;
SElemType*top;
intStacksize;
}SqStack;//栈结构
StatusInitStack(SqStack&S)//初始化栈
{
S.base=(SElemType*)malloc(STACK_INIT_SIZE*sizeof(SElemType));
if(!
S.base)exit(overflow);
S.top=S.base;
S.Stacksize=STACK_INIT_SIZE;
returnok;
}
StatusPush(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(overflow);
S.top=S.base+S.Stacksize;
S.Stacksize+=STACKINCREMENT;
}
*S.top++=e;
returnok;
}
StatusPop(SqStack&S,SElemType&e)//出栈
{
if(S.top==S.base)returnerror;
e=*--S.top;
returnok;
}
boolStackEmpty(SqStackS)//判断栈是否为空
{
if(S.top==S.base)
returnok;
elsereturnerror;
}
StatusInitMaze(MazeType&maze)//初始化迷宫
{
inti,j;
for(j=0;j maze.a[1][j]=1; for(i=1;i { maze.a[i][1]=1; maze.a[i][maze.col+1]=1; for(intj=1;j scanf("%d",&maze.a[i][j]); } for(j=0;j maze.a[maze.row+1][j]=1; returnok; }//为了避免检查边界,把迷宫的外围都设成障碍,迷宫的内核是row行,col列的数组 boolPass(MazeTypemaze,PosTypecurpos)//判断是否可以通过 { returnmaze.a[curpos.x][curpos.y]==0; } StatusFootPrint(MazeType&maze,PosTypecurpos)//留下足迹 { maze.a[curpos.x][curpos.y]=2; returnok; } SElemTypeCreatElem(intstep,PosTypepos,intdi)//创造一个SElemType型的数据 { SElemTypee; e.ord=step; e.seat=pos; e.di=di; returne; } boolIsEnd(PosTypepos1,PosTypepos2)//判断是否结束 { returnpos1.x==pos2.x&&pos1.y==pos2.y; } PosTypeNextPos(PosTypecurpos,intdi)//向下一步搜索 { PosTypepos=curpos; switch(di) { case1: pos.x++;break;//向东 case2: pos.y++;break;//向南 case3: pos.x--;break;//向西 case4: pos.y--;break;//向北 } returnpos; } StatusMarkPrint(MazeType&maze,PosTypecurpos)//在死路处留下印迹 { maze.a[curpos.x][curpos.y]='*'; returnok; } StatusMazePath(MazeType&maze,PosTypestart,PosTypeend)//寻找路径 { //若迷宫maze中存在从入口start到出口end的通道,则求得一条存放在栈中(从栈底到栈顶), //并返回ture;否则返回false SqStackS; SElemTypee; InitStack(S); PosTypecurpos=start;//设定当前位置为入口位置 intcurstep=1;//探索第一步 do{ if(Pass(maze,curpos)) { FootPrint(maze,curpos);//留下足迹 e=CreatElem(curstep,curpos,1); Push(S,e);//加入路径 if(IsEnd(curpos,end)) returnok;//达到终点 curpos=NextPos(curpos,1);//下一步是当期位置的东邻 curstep++;//探索下一步 } else//当前位置不能通过 { if(! StackEmpty(S)) { Pop(S,e); while(e.di==4&&! StackEmpty(S)) { MarkPrint(maze,e.seat);//留下不能通过的标记,并退一步 Pop(S,e); } if(e.di<4) { e.di++;//换下一个方向 Push(S,e); curpos=NextPos(e.seat,e.di);//设定当前位置是新方向上的相邻块 } } } }while(! StackEmpty(S)); returnerror; } StatusPrintMaze(MazeTypemaze)//输出迷宫 { inti,j; for(i=0;i { for(j=0;j printf("%d",maze.a[i][j]); printf("\n"); } returnok; } voidmain() { MazeTypemaze; printf("请输入迷宫的行数row和列数col: "); scanf("%d%d",&maze.row,&maze.col); printf("请输入迷宫数据,0表示通道,1表示障碍: \n"); InitMaze(maze); PosTypestart,end; start.x=2;start.y=2; end.x=maze.row;end.y=maze.col; if(MazePath(maze,start,end)) { printf("迷宫走法(2代表走法,1代表不通)\n"); PrintMaze(maze); } else printf("没有找到通路! \n"); }
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 迷宫 程序代码