c语言迷宫最完整做法_第1页
c语言迷宫最完整做法_第2页
c语言迷宫最完整做法_第3页
免费预览已结束,剩余1页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、:DebugJW.tKe OOOOOB BOH lOOBB OB BOOB BOB BBOOOOOO O OOOOOO" OOO BOH BOOB OOOOOHB OOOO OH O OH OOOOOO#in clude<stdio.h>#in clude<stdlib.h>#in clude<time.h>#defi ne stack_ ini t_size 200#defi ne stack_ in creme nt 10#defi ne ERROE 0#defi ne TRUE 1#defi ne FALSE 0#defi ne OVERFL

2、OW 0#defi ne OK 1typedef int Status;typedef structint兀int y;PosType;typedef struct int ord; /通道块在路径上的"序号”PosType seat; /通道块在迷宫中的"坐标位置”int di;/从此通道块走向下一通道块的“方向”SElemType;typedef structSElemType *base;SElemType *top; int stacksize;SqStack;int mg2020;/* 随机生成迷宫的函数/* 为了能够让尽量能通过,将能通过的块和不能通过的块数量比

3、大致为 void Random()int i,j,k;srand(time(NULL); mg10=mg11=mg1819=0;for(j=0;j<20;j+) mg0j=mg19j=1;/ 将入口、出口设置为“/* 设置迷宫外围“不可走”,2:1*/0”即可通过保证只有一个出口和入口*/for(i=2;i<19;i+)/* 设置迷宫外围“不可走”,保证只有一个出口和入口mgi0=mgi-119=1;*/for(i=1;i<19;i+)for(j=1;j<19;j+) k=rand()%3; / 随机生成 0、1、2 三个数 if(k) mgij=0;elseif(i=

4、1&&j=1)|(i=18&&j=18) /* 因为距入口或出口一步的路是必 经之路,故设该通道块为“0”加大迷宫能通行的概率*/mgij=0;elsemgij=1;/ 构造一个空栈Status InitStack(SqStack &s)s.base =(SElemType *)malloc(stack_init_size * sizeof(SElemType); if(!s.base) return OVERFLOW;s.top=s.base;s.stacksize=stack_init_size;return OK;/ 当前块可否通过Status P

5、ass(PosType e) if (mge.xe.y=0) /0 时可以通过 return OK;/ 如果当前位置是可以通过,返回1return OVERFLOW;/ 其它情况返回 0/ 留下通过的足迹Status FootPrint(PosType e) mge.xe.y=7; return OK;/ 出栈Status Pop(SqStack &s,SElemType &e) if(s.top=s.base) return ERROE;e=*-s.top; return OK;/ 压入栈Status Push(SqStack &s,SElemType e) if(s

6、.top-s.base>=s.stacksize) s.base=(SElemType *)realloc(s.base,(s.stacksize+stack_increment) *sizeof(SElemType); if(!s.base)exit(OVERFLOW); s.top=s.base+s.stacksize; s.stacksize+=stack_increment; *s.top+=e; return OK;/ 是否空栈Status StackEmpty(SqStack s) if (s.top=s.base) return OK; return OVERFLOW;/

7、留下不能通过的足迹Status MarkPrint(PosType e) mge.xe.y=3; return OK;/ 下一步PosType NextPos(PosType &e,int dir)PosType E;switch(dir)case 1:E.x=e.x; / 向下 E.y=e.y+1; break;case 2:E.x=e.x+1; / 向右 E.y=e.y; break;case 3:E.x=e.x; / 向上 E.y=e.y-1; break;case 4:E.x=e.x-1; / 向左 E.y=e.y; break;return E;/若迷宫maze中从入口 st

8、art到出口 end的通道,则求得一条存放在栈中/(从栈底到栈顶),并返回TRUE ;否则返回FALSE/ 迷宫函数Status MazePath(int mg,PosType start,PosType end,SqStack &s)PosType curpos; InitStack(s);SElemType e;int curstep;curpos=start; / 设定 "当前位置 "为" 入口位置 " curstep=1;/ 探索第一步doif(Pass(curpos) / 当前位置可通过,即是未曾走到过的通道块 FootPrint(cu

9、rpos); / 留下足迹 e.di =1;e.ord = curstep;e.seat= curpos;Push(s,e); / 加入路径 if(curpos.x=end.x && curpos.y=end.y)n0 n _ n 0能到达终点!n路径如下:n"); return TRUE;curpos=NextPos(curpos,1); / 下一位置是当前位置的东邻curstep+; / 探索下一步else/ / 当前位置不能通过 if(!StackEmpty(s)Pop(s,e);while(e.di=4&&!StackEmpty(s)MarkP

10、rint(e.seat);Pop(s,e); if(e.di<4)e.di+;Push(s,e); / 留下不能通过的标记,并退回一步 curpos=NextPos(e.seat,e.di); /* 当前位置设为新方向的相邻块 */ /if/if/elsewhile(!StackEmpty(s);printf("nn 此迷宫不能走通! n");return FALSE;/ 打印迷宫 void PrintMaze()int i,j;printf(" 运行路径 :nn"); for(i=0;i<20;i+) for(j=0;j<20;j+)

11、/迷"宫); 的“墙”/ 不通的路/ Q通")i的路径if(mgij=0)printf(" "); else if(mgij=1) printf(" else if(mgij=3) printf(" "); else if(mgij=7) printf("printf("n");printf("n");void mai n()SqStack S;PosType start,end;start.x=1;start.y=0; / 起点坐标end.x=18;end.y=19; / 终点坐标Random();printf("nnTest 1:");MazePath(mg2020,start,end,S);PrintMaze(); system("pause");Random();printf("nTest 2:");MazePat

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论