C语言实现数据结构迷宫实验
本文实例为大家分享了C语言实现简单的数据结构迷宫实验,供大家参考,具体内容如下
分析:迷宫实验主要有两部分操作,其一是对迷宫的生成,其二是寻路使用栈的操作。
步骤:
一、.h文件
1、首先是迷宫的生成,可以使用随机数种子生成,但主要逻辑部分并不在此,所以在这里直接写死,固定下来。
定义一个坐标类型的结构体,和二维数组迷宫:
typedefstruct{ intx; inty; }Pos; //迷宫类型 typedefstruct{ intsquare[10][10]= { {1,1,1,1,1,1,1,1,1,1}, {1,0,0,0,0,0,0,0,0,1}, {1,1,1,1,0,1,1,1,0,1}, {1,0,0,0,0,1,0,1,0,1}, {1,0,1,1,1,1,0,1,1,1}, {1,0,0,0,0,1,0,0,0,1}, {1,0,1,1,0,0,0,1,0,1}, {1,0,1,1,1,0,1,1,1,1}, {1,0,0,0,1,0,0,0,0,1}, {1,1,1,1,1,1,1,1,1,1}, }; }Maze; typedefPosSElemType;
2、然后是对栈的声明,栈里储存的元素为坐标类型
//顺序栈 #defineMAXSIZE50 typedefstruct{ SElemType*base; SElemType*top;//栈顶指针 intstacksize; }SqStack;
3、栈操作函数声明
typedefintStatus; #defineOK1; #defineERROR0; //栈的相关操作 //初始化栈 StatusinitStack(SqStack&s); //压栈 Statuspush(SqStack&s,SElemTypee); //出栈 SElemTypepop(SqStack&s); //清空栈 StatusclearStack(SqStack&s); //摧毁栈 voiddestroyStack(SqStack&s); //遍历栈 StatusstackTravel(SqStacks);
4、迷宫操作函数声明
//初始化迷宫(同时生成起始点和终点) voidinitMaze(Maze&maze); //打印迷宫 voidshowMaze(Mazemaze); //寻找出路;传入一个迷宫和栈找出出路 voidfindWay(Maze&maze,SqStack&s); //判断该点的四个方向是否有通路,有就前进 PosisExit(Posp,Mazemaze);
二、.cpp文件
1、导入所需头文件
#include"pch.h" #include#include #include usingnamespacestd;
2、栈操作实现
//构造空栈 StatusinitStack(SqStack&s){ s.base=newSElemType[MAXSIZE]; if(!s.base) { exit(OVERFLOW);//分配失败 } s.top=s.base; s.stacksize=MAXSIZE; returnOK; } //入栈 Statuspush(SqStack&s,SElemTypee){ //判断栈满 if(s.top-s.base==s.stacksize) { returnERROR; } //存入元素,*为取指针的值 s.top++; *s.top=e; returnOK; } //出栈,用e返回栈顶值 SElemTypepop(SqStack&s){ SElemTypee; //判断栈为空 if(s.top==s.base) { //若为空则返回一个(-1,-1)的点,判断由外部调用时进行 e.x=-1; e.y=-1; returne; } e=*s.top; s.top--; returne; } StatusclearStack(SqStack&s){ s.top=s.base; returnOK; } voiddestroyStack(SqStack&s){ s.top=NULL; s.stacksize=0; free(s.base); } StatusstackTravel(SqStacks){ while(s.top!=s.base) { s.base++; Posp=*s.base; //输出走过的路径 cout<<"("<"; if(p.x==0||p.y==0||p.x==9||p.y==9) { //终点输出为“End” cout<<"End"; } } cout< 3、迷宫操作实现
///////////////////////////////////////迷宫操作//////////////////////////////// //初始化函数,传入一个迷宫,随机生成起点和终点,由于起点有一定限制,所以这里起点也固定为几个最合适的点 voidinitMaze(Maze&maze){ //生成随机数 srand((unsigned)time(NULL)); intindex=rand()%36+1; intstart=index%6+1; //生成起始点数值为‘s' switch(start) { case1: maze.square[1][1]='s'; break; case2: maze.square[3][8]='s'; break; case3: maze.square[3][6]='s'; break; case4: maze.square[6][8]='s'; break; case5: maze.square[8][3]='s'; break; case6: maze.square[8][8]='s'; break; } //随机生成终点'e'表示 while(index=rand()%36+1) { //出口在顶部 if(index>1&&index<10&&maze.square[1][index-1]!='s') { maze.square[0][index-1]='e'; break; } //出口在右侧 elseif(index>10&&index<19) { if(maze.square[index-10][8]!=1&&maze.square[index-10][8]!='s'){ maze.square[index-10][9]='e'; break; } } //底部出口 elseif(index>19&&index<28) { if(maze.square[8][index-19]!='s'&&maze.square[8][index-19]!=1){ maze.square[9][index-19]='e'; break; } } //左侧出口 elseif(index>28&&index<=36) { if(maze.square[index-28][1]!=1&&maze.square[index-28][1]!='s') { maze.square[index-28][0]='e'; break; } } } } voidshowMaze(Mazemaze){ for(inti=0;i<10;i++) { for(intj=0;j<10;j++) { if(maze.square[i][j]==1) { cout<<"*"; } elseif(maze.square[i][j]==0) { cout<<""; } else { cout<<(char)maze.square[i][j]<<""; } } cout<x!=end.x||s.top->y!=end.y) { //获得下一步坐标 Pospath=isExit(go,maze); if(path.x!=go.x||path.y!=go.y) { //前进 maze.square[path.x][path.y]='p'; push(s,path); go=path; } //如果所有放向都走不通(即返回的点是传入的点),则将其标为“@”,出栈到上一个点,继续判断 else { //走不通pop maze.square[path.x][path.y]='@'; pop(s); go=*s.top; } } maze.square[end.x][end.y]='e'; } //判断返回下一步路径(顺序:右下左上),传入所处位置,从右边开始判断是否又通路或者出口,有就返回哪个方向上的点 PosisExit(Posp,Mazemaze){ PostempP=p; if(maze.square[tempP.x][tempP.y+1]==0||maze.square[tempP.x][tempP.y+1]=='e') { tempP.y++; } elseif(maze.square[tempP.x+1][tempP.y]==0||maze.square[tempP.x+1][tempP.y]=='e') { tempP.x++; } elseif(maze.square[tempP.x][tempP.y-1]==0||maze.square[tempP.x][tempP.y-1]=='e') { tempP.y--; } elseif(maze.square[tempP.x-1][tempP.y]==0||maze.square[tempP.x-1][tempP.y]=='e') { tempP.x--; } returntempP; } 三、main函数调用
intmain() { while(true) { //创建一个迷宫 Mazemaze; initMaze(maze); //初始化一个栈 SqStackS; initStack(S); cout<<"*****************************"<>select; if(select==1) { cout<<"生成随机起点和出口迷宫:"< 四、评价
这是个叫简易的迷宫,但基本实现了迷宫的寻路逻辑,可改进的地方有:
1、因为很多地方写死了,所以复用性不高,可以用循环遍历来随机生成起点,同理迷宫的生成也是这样
2、判断路径可以用递归调用实现前进逻辑以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。