C语言数据结构迷宫问题

上传人:小** 文档编号:112050466 上传时间:2022-06-22 格式:DOC 页数:13 大小:93.50KB
收藏 版权申诉 举报 下载
C语言数据结构迷宫问题_第1页
第1页 / 共13页
C语言数据结构迷宫问题_第2页
第2页 / 共13页
C语言数据结构迷宫问题_第3页
第3页 / 共13页
资源描述:

《C语言数据结构迷宫问题》由会员分享,可在线阅读,更多相关《C语言数据结构迷宫问题(13页珍藏版)》请在装配图网上搜索。

1、#include#include#include#defineM20#defineN20#definevisited2#defineTRUE1#defineFALSE0#defineINITSIZE100typedefintStatus;typedefstruct/坐标点结构体inty;/每个可通的行坐标intx;/每个可通的列坐标PosType;typedefstructintord;/通道块在路径上的“序号”intdi;/从此通道块走向下一通道块的“方向”PosTypeseat;/通道块在迷宫中的“坐标位置”MazeNode;/迷宫节点typedefstructMazeNodebaseIN

2、ITSIZE;inttop;/栈顶指针Stack;typedefstruct/用于存储迷宫的路径PosTypecoorINITSIZE;inttop;Postion;voidRandMatrix();/随机生成迷宫intInitStack(Stack*);/初始化栈intInitStack1(Postion*);intStackEmpty(Stack*);/判断栈是否为空intStackEmpty1(Postion*);intStackIsFull(Stack*);/判断栈是否满了intStackIsFull1(Postion*);/判断栈是否满了intPush(Stack*s,MazeNod

3、em);/压栈intPush1(Postion*,PosType);intPop(Stack*s,MazeNode*m);/出栈intPop1(Postion*,PosType*);intDestroyStack(Stack*s);/撤销栈intPass(PosTypepos);/判断指定坐标是否可通过intFootPrint(PosTypepos);/标记能通过的PosTypeNextCoord(PosTypepos,inti);/获取下一位置intMarkPrint(PosTypepos);/留下不能通过的标记,并退回一步intMazePath(PosTypestart,PosTypeen

4、d,Postion*);/从迷宫的入口到出口查找voidPrintMaze(Postion*);/输出迷宫intmgMN;生成一个M*N的迷宫intmain()inth=1;PosTypestart,end;PostionP;while(h)printf(”创建迷宫n”);InitStack1(&P);RandMatrix();printf(n);printf(1、重新生成迷宫,0、就这个:”);scanf(%d,&h);do/输入迷宫入口坐标printf(n输入迷宫入口坐标”);scanf(%d%d,&start.x,&start.y);if(start.xN|start.yM)printf

5、(输入的坐标越界,请重新输入!n);continue;while(start.xN|start.yM);do/输入迷宫出口坐标printf(n输入迷宫出口坐标:”);scanf(%d%d,&end.x,&end.y);if(end.xN|end.yM)printf(输入的坐标越界,请重新输入!n”);continue;while(end.xN|end.yM);if(!MazePath(start,end,&P)/调用函数查找路径printf(n无法通过!n);elsePrintMaze(&P);/打印找到的路径return0;intInitStack(Stack*s)s-top=-1;retu

6、rn1;intInitStack1(Postion*s)s-top=-1;return1;intStackEmpty(Stack*s)if(s-top=-1)return1;return0;intStackEmpty1(Postion*s)if(s-top=-1)return1;return0;intStackIsFull(Stack*s)if(s-top=INITSIZE-1)return1;elsereturn0;intStackIsFull1(Postion*s)if(s-top=INITSIZE-1)return1;elsereturn0;intPush(Stack*s,MazeNod

7、em)if(!StackIsFull(s)s-top+;s-bases-top=m;return1;intPush1(Postion*s,PosTypem)if(!StackIsFull1(s)s-top+;s-coors-top=m;return1;intPop(Stack*s,MazeNode*m)if(s-top!=-1)*m=s-bases-top;s-top-;return1;return1;intPop1(Postion*s,PosType*m)if(s-top!=-1)*m=s-coors-top;s-top-;return1;return1;intDestroyStack(St

8、ack*s)s-top=-1;return1;-aseuealq窣如Bp叵、H+X.sodaseu軒豊叵阳mv8Z9S寸MZW、(DIP起罗s劉巴畚更、(二ursodadAJ.SOd)poxaNadAlsodHUn4alCN丄x.sod=A.sod6iu(sodadAJ_sod)4.E.ld4ood4.Eoun电asoHUn4&lUE、(0丄x.sod=A.sod6lu)*:amlffKn啾堕制骰吧lii:、(sodadAJ.SOd)ssed4.EHu+X.sodHu.sod00aseu空eaiqHu.sod:Laseu空eaiqHu.sodHx.sod-9aseu空eaiqHx.sodnas

9、eu空eaiqHx.sodHu+A.sod&aseu空eaiqHu+A.sodmaseu空eaiqHu+A.sodHu+X.soddefault:exit(0);returnpos;intMarkPrint(PosTypepos)/留下不能通过的标记,并退回一步mgpos.ypos.x=3;/3表示曾走过,但不通return1;voidRandMatrix()inti=0,j=0;srand(unsigned)time(NULL);for(i=0;iM;i+)for(j=0;jN;j+)mgij=rand()%2;i=0;for(j=0;jN;j+)mgij=1;mgji=1;i=N-1;fo

10、r(j=0;jM;j+)mgji=1;mgij=1;mg11=0;mgM-2N-2=0;printf(n);for(i=0;iM;i+)for(j=0;jN;j+)if(mgij=1)/若是障碍printf(”);elseif(mgij=2)/若是可通路径printf();elseif(mgij=3)printf(*”);其他位置elseprintf();printf(n);intMazePath(PosTypestart,PosTypeend,Postion*P)/从迷宫的入口到出口查找若迷宫maze中存在从入口start到出口end的通道,则求得一条存放在栈中(从栈底到栈顶)/并返回TRU

11、E,否则返回FALSEStackS;/定义栈PosTypecurpos;intcurstep;/当前序号1,2,3,4,5,6,7,8代表方向,1代表向右,后依次顺时针MazeNodee;InitStack(&S);curpos=start;/设定“当前位置”为“入口位置”,从入口位置开始查找curstep=1;/探索第一步doif(Pass(curpos)/从当前位置可以通过,即是未曾走到过的通道块FootPrint(curpos);/标记能通过的e.ord=curstep;/保存步数e.seat=curpos;e.di=1;/向右侧探测Push(&S,e);/加入路径Push1(P,cur

12、pos);if(curpos.y=end.x&curpos.x=end.y)/若当前位置是出口坐标DestroyStack(&S);/释放栈占用的空间return1;/返回查找成功else/与出口坐标不同curpos=NextCoord(curpos,1);/向右侧探测curstep+;/探索下一步else/当前位置不能通过(为障碍或已走过)if(!StackEmpty(&S)/若栈不为空,之前有走过的位置Pop(&S,&e);/出栈(返回上一步的位置)Pop1(P,&curpos);while(e.di=8&!StackEmpty(&S)/上一步,四个方向都探测定,且栈不为空MarkPrin

13、t(e.seat);/留下不能通过的标记,并退回一步Pop(&S,&e);/出栈,返回上一步Pop1(P,&curpos);if(e.di8)e.di+;/换下一个方向探索,准备探测下一个方向Push(&S,e);/将当前节点入栈Push1(P,curpos);curpos=NextCoord(e.seat,e.di);/设定当前位置是该新方向上的相邻块,查找下一个应该探测的方向while(!StackEmpty(&S);/程序运行到这里,表示没有能通达的路径DestroyStack(&S);/释放占用的空间returnFALSE;/返回失败voidPrintMaze(Postion*P)/输出迷宫inti,j;PosTypee;PostionW;InitStack1(&W);while(!StackEmpty1(P)Pop1(P,&e);Push1(&W,e);printf(”n可以通过,迷宫路径:n”);/在这里可以设置迷宫的界面for(i=0;iM;i+)for(j=0;jpssiar一三罗H=-=11=)七三0.宀=-=)七=0.

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

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!