数据结构栈求解迷宫问题(C语言版)

合集下载

数据结构(C语言版)实验报告(迷宫)

数据结构(C语言版)实验报告(迷宫)

《数据结构与算法》实验报告评分依据及结果一、需求分析1.问题描述:以一个m*n的长方阵表示迷宫,空格和感叹号分别表示迷宫中的通路和障碍。

设计一个程序,对随机产生的迷宫,求一条从入口到出口的通路,或得出没有通路的结论。

2.基本要求首先实现一个以链表为存储结构的栈类型,然后编写一个求解迷宫的非递归程序。

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

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

3.程序的执行命令有:1)输入迷宫的列数2)输入迷宫的行数二、概要设计为实现上述功能,需要以一个链表为存储结构的栈类型1.栈的顺序存储表示typedef struct{int x; /*列*/int y; /*行*/}PosType; //坐标位置类型typedef struct{int ord; //通道块在路径上的"序号"PosType seat; //通道块在迷宫中的"坐标位置"int di; //从此通道块走向下一通道块的"方向"}SElemType; //栈的元素类型typedef struct{SElemType *base;SElemType *top;int stacksize; //当前已分配的存储空间,以元素为单位}SqStack;//迷宫程序typedef struct{int lie; /*列数*/int hang; /*行数*/char a[999][999];}MazeType; /*迷宫类型*/2.基本操作int InitStack(SqStack *S)//分配空间int GetTop(SqStack *S,SElemType *e) //若栈不空,则用e返回S的栈顶元素,并返回OK;否则返回ERRORint Push(SqStack *S,SElemType *e)//插入元素e作为新的栈顶元素int Pop(SqStack *S,SElemType *e) //若栈不空,则删除S的栈顶元素,用e返回其值,并返回OK;否则返回ERRORint generatemaze( MazeType *maze)// 随机生成迷宫int Pass(MazeType *maze, PosType curpos ) //判断当前位置可否通过int FootPrint(MazeType *maze,PosType curpos) //留下足迹int MarkPrint(MazeType *maze,PosType curpos) //留下不能通过的标记PosType NextPos(PosType curpos,int di) //返回当前位置的下一位置int MazePath(MazeType *maze,PosType start,PosType end) //若迷宫有解,则求得一条存放在栈中(从栈底到栈顶),并返回OK,否则返回ERROR void PrintMaze(MazeType *maze) //打印迷宫三、详细设计//程序的头文件#include <stdio.h>#include <malloc.h>#include <stdlib.h>#include <string.h>#include <time.h>//函数的返回值#define OK 1#define ERROR 0#define NULL 0#define OVERFLOW -2#define STACK_INIT_SIZE 100#define STACKINCREMENT 10//栈的顺序存储表示typedef struct{int x; /*列*/int y; /*行*/}PosType; //坐标位置类型typedef struct{int ord; //通道块在路径上的"序号"PosType seat; //通道块在迷宫中的"坐标位置"int di; //从此通道块走向下一通道块的"方向"}SElemType; //栈的元素类型typedef struct{SElemType *base;SElemType *top;int stacksize; //当前已分配的存储空间,以元素为单位}SqStack;//基本操作int InitStack(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;return OK;}//若栈不空,则用e返回S的栈顶元素,并返回OK;否则返回ERRORint GetTop(SqStack *S,SElemType *e){if(S->top==S->base)return ERROR;*e=*(S->top-1);return OK;}int Push(SqStack *S,SElemType *e)//插入元素e作为新的栈顶元素{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;return OK;}//若栈不空,则删除S的栈顶元素,用e返回其值,并返回OK;否则返回ERRORint Pop(SqStack *S,SElemType *e){if(S->top==S->base)return ERROR;*e=*--S->top;return OK;}int StackEmpty(SqStack *S){return(S->top==S->base);}//迷宫程序typedef struct{int lie; /*列数*/int hang; /*行数*/char a[999][999];}MazeType; /*迷宫类型*//*随机生成迷宫*/int generatemaze( MazeType *maze){int i,j;maze->a[0][0]=2;maze->a[++maze->hang][++maze->lie]=3; /*设置外墙*/maze->a[0][maze->lie]='!';maze->a[maze->hang][0]='!';for(j=1;j<maze->lie;j++){maze->a[0][j]='!';maze->a[maze->hang][j]='!';}for(i=1;i<maze->hang;i++){maze->a[i][0]='!';maze->a[i][maze->lie]='!';}srand((unsigned)time( NULL ));rand();for(i=1; i <maze->hang; i++)for(j=1;j<maze->lie;j++){if (rand()>=RAND_MAX/4) maze->a[i][j] =' '; //' ' 暗示出路else maze->a[i][j] ='!'; //'!'暗示无出路}return OK;}int Pass(MazeType *maze, PosType curpos ) //判断当前位置可否通过{if ((curpos.x < 1) || (curpos.x >= maze->lie))return ERROR;if ((curpos.y < 1) || (curpos.y >= maze->hang))return ERROR;if (maze->a[curpos.y][curpos.x]==' ')return OK;else return ERROR;}int FootPrint(MazeType *maze,PosType curpos) //留下足迹{maze->a[curpos.y][curpos.x]='*';return OK;}int MarkPrint(MazeType *maze,PosType curpos) //留下不能通过的标记{maze->a[curpos.y][curpos.x]='@';return OK;}PosType NextPos(PosType curpos,int di)//返回当前位置的下一位置{PosType pos=curpos;switch(di){case 1: //右东pos.x++;break;case 2: //下南pos.y++;break;case 3: //左西pos.x--;break;case 4: //上北pos.y--;break;}return pos;}//若迷宫有解,则求得一条存放在栈中(从栈底到栈顶),并返回OK,否则返回ERROR int MazePath(MazeType *maze,PosType start,PosType end){PosType curpos;SqStack *S=(SqStack *)malloc(sizeof(SqStack));InitStack(S);SElemType *e;e=(SElemType *)malloc(sizeof(SElemType));curpos=start; //设定当前位置为入口位置int curstep = 1; //探索第一步do {if(Pass(maze,curpos)) //当前位置可通过{FootPrint(maze,curpos);e->ord=curstep;e->seat=curpos;e->di=1;Push(S,e);if(curpos.x==end.x&&curpos.y==end.y)return (OK);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=e->seat;curpos=NextPos(curpos,e->di);}}}}while(!StackEmpty(S));return ERROR;}void PrintMaze(MazeType *maze) //打印迷宫{int i,j,k,n;int c[999],d[999];for(i=0,k=0;i<=maze->hang;i++){for(j=0;j<=maze->lie;j++){printf("%c ",maze->a[i][j]);if(maze->a[i][j]=='*'){c[k]=i;d[k]=j;k++;}}printf("\n");}n=k;for(k=0;k<n;k++)printf("<%d,%d>",c[k],d[k]);printf("\n");printf("\n");}int main(){int zmg;char ch;printf(" 数据结构课程设计--迷宫问题求解\n\n");printf(" |----------------------------------------|\n");printf(" | |\n");printf(" | |\n");printf(" | |\n");printf(" | |\n");printf(" | XXXX XXXXXXXXXXXXXX |\n");printf(" | XXXXXXX |\n");printf(" |----------------------------------------|\n");getchar();do{system("cls");fflush(stdin);MazeType *maze=(MazeType *)malloc(sizeof(MazeType)); //设置迷宫的长宽不含外墙printf("请输入迷宫的列数(不含外墙时):");scanf("%d",&maze->lie);printf("请输入迷宫的行数(不含外墙时):");scanf("%d",&maze->hang);generatemaze(maze);printf("随机创建迷宫\n");PrintMaze(maze);getchar();getchar();PosType start,end;start.x=1;start.y=1;end.x=maze->lie-1;end.y=maze->hang-1;zmg=MazePath(maze,start,end);if(zmg){printf("此迷宫通路为\n");PrintMaze(maze);}elseprintf("此迷宫无通路\n"); //getchar();printf("再次尝试?(Y/N)?");scanf("%c",&ch);}while(ch=='Y'||ch=='y');return 0;}四、调试分析1.本程序界面设计合理,以空格为通路,感叹号!为障碍,笑脸为起始点,*为行走路线,心形为出口设计精巧,便于用户使用。

用C语言解决迷宫问题

用C语言解决迷宫问题

⽤C语⾔解决迷宫问题#include <stdio.h>#include <stdlib.h>#define ROW 10#define COL 10/*迷宫中位置信息*/typedef struct position{int x;int y;}position;/*在迷宫中的当前位置的信息,也是⼊栈的基本元素*/typedef struct SElem{int di;position seat;}SElem;/*链式栈中节点的定义*/typedef struct position_stack{SElem p;struct position_stack *next;}*Stack_pNode,Stack_Node;void InitStack(Stack_pNode *Link){*Link = NULL;}void push(Stack_pNode *Link,SElem e){Stack_pNode new_SElem = (Stack_pNode)calloc(1,sizeof(Stack_Node));new_SElem->p = e;new_SElem->next = NULL;if (*Link == NULL)*Link = new_SElem;else{new_SElem->next = *Link;*Link = new_SElem;}}int pop(Stack_pNode *Link,SElem *e){if (*Link == NULL)return 0;*e = (*Link)->p;Stack_pNode q = *Link;*Link = (*Link)->next;free(q);return 1;}int top(Stack_pNode Link, SElem *e){if (Link == NULL)return 0;*e = Link->p;return 1;}int empty(Stack_pNode Link){if (Link == NULL)return 1;elsereturn 0;}int reverse(Stack_pNode *Link){Stack_pNode p, q, r;if (*Link == NULL || (*Link)->next == NULL)return 0;r = *Link;p = (*Link)->next;q = NULL;while (p){r->next = q;q = r;r = p;p = p->next;}r->next = q;*Link = r;}void print(Stack_pNode Link){Stack_pNode r = Link;while (r){printf("(%d,%d) -> ",r->p.seat.x,r->p.seat.y);r = r->next;}printf("exit\n");}int curstep = 1;/*纪录当前的⾜迹,填写在探索前进的每⼀步正确的路上*//*迷宫地图。

C语言实现数据结构迷宫实验

C语言实现数据结构迷宫实验

C语⾔实现数据结构迷宫实验本⽂实例为⼤家分享了C语⾔实现简单的数据结构迷宫实验,供⼤家参考,具体内容如下分析:迷宫实验主要有两部分操作,其⼀是对迷宫的⽣成,其⼆是寻路使⽤栈的操作。

步骤:⼀、.h⽂件1、⾸先是迷宫的⽣成,可以使⽤随机数种⼦⽣成,但主要逻辑部分并不在此,所以在这⾥直接写死,固定下来。

定义⼀个坐标类型的结构体,和⼆维数组迷宫:typedef struct {int x;int y;}Pos;//迷宫类型typedef struct {int square[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;typedef Pos SElemType;2、然后是对栈的声明,栈⾥储存的元素为坐标类型//顺序栈#define MAXSIZE 50typedef struct {SElemType *base;SElemType *top; //栈顶指针int stacksize;}SqStack;3、栈操作函数声明typedef int Status;#define OK 1;#define ERROR 0;//栈的相关操作//初始化栈Status initStack(SqStack &s);//压栈Status push(SqStack &s, SElemType e);//出栈SElemType pop(SqStack &s);//清空栈Status clearStack(SqStack &s);//摧毁栈void destroyStack(SqStack &s);//遍历栈Status stackTravel(SqStack s);4、迷宫操作函数声明//初始化迷宫(同时⽣成起始点和终点)void initMaze(Maze &maze);//寻找出路;传⼊⼀个迷宫和栈找出出路void findWay(Maze &maze,SqStack &s);//判断该点的四个⽅向是否有通路,有就前进Pos isExit(Pos p, Maze maze);⼆、.cpp⽂件1、导⼊所需头⽂件#include "pch.h"#include <iostream>#include<time.h>#include<stdlib.h>using namespace std;2、栈操作实现//构造空栈Status initStack(SqStack &s) {s.base = new SElemType[MAXSIZE];if (!s.base){exit(OVERFLOW);//分配失败}s.top = s.base;s.stacksize = MAXSIZE;return OK;}//⼊栈Status push(SqStack &s, SElemType e) {//判断栈满if (s.top-s.base == s.stacksize){return ERROR;}//存⼊元素,*为取指针的值s.top++;*s.top = e;return OK;}//出栈,⽤e返回栈顶值SElemType pop(SqStack &s) {SElemType e;//判断栈为空if (s.top == s.base){//若为空则返回⼀个(-1,-1)的点,判断由外部调⽤时进⾏ e.x = -1;e.y = -1;return e;}e = *s.top;s.top--;return e;}Status clearStack(SqStack &s) {s.top = s.base;return OK;}void destroyStack(SqStack &s) {s.top = NULL;s.stacksize = 0;free(s.base);}Status stackTravel(SqStack s) {while (s.top != s.base){s.base++;Pos p = *s.base;if ( p.x == 0 || p.y == 0|| p.x == 9 ||p.y == 9){//终点输出为“End”cout << "End";}}cout << endl;return 0;}3、迷宫操作实现///////////////////////////////////////迷宫操作//////////////////////////////////初始化函数,传⼊⼀个迷宫,随机⽣成起点和终点,由于起点有⼀定限制,所以这⾥起点也固定为⼏个最合适的点void initMaze(Maze &maze) {//⽣成随机数srand((unsigned)time(NULL));int index = rand() % 36 + 1;int start = index % 6 + 1;//⽣成起始点数值为‘s'switch (start){case 1:maze.square[1][1] = 's';break;case 2:maze.square[3][8] = 's';break;case 3:maze.square[3][6] = 's';break;case 4:maze.square[6][8] = 's';break;case 5:maze.square[8][3] = 's';break;case 6: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;}//出⼝在右侧else if (index>10 &&index <19){if (maze.square[index-10][8] != 1 && maze.square[index-10][8]!='s') {maze.square[index-10][9] = 'e';break;}}//底部出⼝else if (index >19&&index<28){if (maze.square[8][index - 19] != 's' && maze.square[8][index - 19] != 1) {maze.square[9][index - 19] = 'e';break;}}//左侧出⼝else if (index >28 && index <=36){if (maze.square[index-28][1] != 1 &&maze.square[index-28][1] != 's'){maze.square[index - 28][0] = 'e';break;}}}void showMaze(Maze maze) {for (int i = 0; i < 10; i++){for (int j = 0; j < 10; j++){if (maze.square[i][j] == 1){cout << "* ";}else if (maze.square[i][j] == 0){cout << " ";}else{cout << (char)maze.square[i][j]<<" ";}}cout << endl;}}//寻找迷宫路径void findWay(Maze &maze,SqStack &s) {//⾸先遍历找出起始点和终点并保存下来Pos start,end;for (int i = 0; i < 10; i++){for (int j = 0; j < 10; j++) {if (maze.square[i][j] == 's'){ //起点压⼊栈内start.x = i;start.y = j;push(s, start);}else if (maze.square[i][j] == 'e'){ //出⼝end.x = i;end.y = j;}}}//寻找路径Pos go = start;//直到找到出⼝才结束while ( s.top->x != end.x || s.top->y != end.y){//获得下⼀步坐标Pos path = 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{//⾛不通popmaze.square[path.x][path.y] = '@';pop(s);go = *s.top;}}maze.square[end.x][end.y] = 'e';}//判断返回下⼀步路径(顺序:右下左上),传⼊所处位置,从右边开始判断是否⼜通路或者出⼝,有就返回哪个⽅向上的点Pos isExit(Pos p,Maze maze) {Pos tempP = p;if (maze.square[tempP.x][tempP.y+1] == 0 || maze.square[tempP.x][tempP.y + 1] == 'e'){tempP.y++;else if(maze.square[tempP.x+1][tempP.y] == 0 || maze.square[tempP.x +1][tempP.y] == 'e'){tempP.x++;}else if (maze.square[tempP.x][tempP.y - 1] == 0 || maze.square[tempP.x][tempP.y - 1] == 'e'){tempP.y--;}else if (maze.square[tempP.x - 1][tempP.y] == 0 || maze.square[tempP.x - 1][tempP.y] == 'e'){tempP.x--;}return tempP;}三、main函数调⽤int main(){while (true){//创建⼀个迷宫Maze maze;initMaze(maze);//初始化⼀个栈SqStack S;initStack(S);cout << "*****************************" << endl;cout << "* 1、⽣成迷宫 2、退出 *" << endl;cout << "*****************************" << endl;cout << "请输⼊你的选择:";int select = 0;cin >> select;if (select == 1){cout << "⽣成随机起点和出⼝迷宫:" << endl;showMaze(maze);cout << "⽣成迷宫路径:" << endl;findWay(maze, S);stackTravel(S);showMaze(maze);cout << endl;}if (select == 2){clearStack(S);break;}}return 0;}四、评价这是个叫简易的迷宫,但基本实现了迷宫的寻路逻辑,可改进的地⽅有:1、因为很多地⽅写死了,所以复⽤性不⾼,可以⽤循环遍历来随机⽣成起点,同理迷宫的⽣成也是这样2、判断路径可以⽤递归调⽤实现前进逻辑以上就是本⽂的全部内容,希望对⼤家的学习有所帮助,也希望⼤家多多⽀持。

栈的应用-迷宫问题-数据结构(C语言版)-源代码(直接运行)

栈的应用-迷宫问题-数据结构(C语言版)-源代码(直接运行)

#include <stdio.h>#include <stdlib.h>#include <string.h>#define STACK_INIT_SIZE 100#define INCREMENT 10typedef struct{int r;int c;}zuobiao;typedef struct{int ord; //在当前坐标上的“标号”zuobiao seat; //坐标int di; //走向下一通道的方向}lujing;typedef struct{int sz[10][10];}Maze;typedef struct SqStack{lujing *base;lujing *top;int size;}SqStack;int initStack(SqStack *s){s->base = (lujing *)malloc(STACK_INIT_SIZE*sizeof(lujing) );if(!s->base)return -1;s->top = s->base;s->size = STACK_INIT_SIZE;return 0;}int push(SqStack *s, lujing e){if(s->top - s->base >= s->size){s->base = (lujing *)realloc(s->base, (s->size+INCREMENT)*sizeof(lujing));if(!s->base)return -1;s->top = s->base+s->size;s->size += INCREMENT;}*s->top++ = e;return 0;}int pop(SqStack *s,lujing *e){if(s->top == s->base)return -1;*e = *(--s->top);return 0;}int isEmpty(SqStack *s){if(s->base == s->top)return 1;elsereturn 0;}int pass( Maze maze,zuobiao dqzb) {if (maze.sz[dqzb.r][dqzb.c]==1)return 1; // 如果当前位置是可以通过,返回1else return 0; // 否则返回0}void footPrint(Maze &maze,zuobiao dqzb) {maze.sz[dqzb.r][dqzb.c]=9;}void markPrint(Maze &maze,zuobiao dqzb) {maze.sz[dqzb.r][dqzb.c]=4;}zuobiao nextPos(zuobiao dqzb, int Dir) {zuobiao xzb;switch (Dir) {case 1:xzb.r=dqzb.r;xzb.c=dqzb.c+1;break;case 2:xzb.r=dqzb.r+1;xzb.c=dqzb.c;break;case 3:xzb.r=dqzb.r;xzb.c=dqzb.c-1;break;case 4:xzb.r=dqzb.r-1;xzb.c=dqzb.c;break;}return xzb;}int mazePath(Maze &maze, zuobiao start, zuobiao end){SqStack *s = (SqStack *)malloc(sizeof(SqStack));initStack(s);zuobiao dqzb = start; // 设定"当前位置"为"入口位置"lujing e;int curstep = 1; // 探索第一步do {if (pass(maze,dqzb)) { // 当前位置可通过,即是未曾走到过的通道块footPrint(maze,dqzb); // 留下足迹e.di =1;e.ord = curstep;e.seat= dqzb;push(s,e); // 加入路径if (dqzb.r == end.r && dqzb.c==end.c)return 0; // 到达终点(出口)dqzb = nextPos(dqzb, 1); // 下一位置是当前位置的东邻curstep++; // 探索下一步} else { // 当前位置不能通过if (!isEmpty(s)) {pop(s,&e);while (e.di==4 && !isEmpty(s)) {markPrint(maze,e.seat);pop(s,&e); // 留下不能通过的标记,并退回一步}if (e.di<4) {e.di++; // 换下一个方向探索push(s, e);dqzb = nextPos(e.seat, e.di); // 当前位置设为新方向的相邻块}}}} while (!isEmpty(s) );return -1;}void main(){printf(" *----Δ迷宫求解Δ----*\n\n");printf("---迷宫如下所示:(说明:0表示墙;1表示可以通过)");printf("\n");Maze maze; //声明mazemaze.sz[0][0]= 0;maze.sz[0][1]= 0;maze.sz[0][2]= 0;maze.sz[0][3]= 0;maze.sz[0][4]= 0;maze.sz[0][5]= 0;maze.sz[0][6]= 0;maze.sz[0][7]= 0;maze.sz[0][8]= 0;maze.sz[0][9]= 0;maze.sz[1][0]= 0;maze.sz[1][1]= 1;maze.sz[1][2]= 1;maze.sz[1][3]= 0;maze.sz[1][4]= 1;maze.sz[1][5]= 1;maze.sz[1][6]= 1;maze.sz[1][7]= 0;maze.sz[1][8]= 1;maze.sz[1][9]= 0;maze.sz[2][0]= 0;maze.sz[2][1]= 1;maze.sz[2][2]= 1;maze.sz[2][3]= 0;maze.sz[2][4]= 1;maze.sz[2][5]= 1;maze.sz[2][6]= 1;maze.sz[2][7]= 0;maze.sz[2][8]= 1;maze.sz[2][9]= 0;maze.sz[3][0]= 0;maze.sz[3][1]= 1;maze.sz[3][2]= 1;maze.sz[3][3]= 1;maze.sz[3][4]= 1;maze.sz[3][5]= 0;maze.sz[3][6]= 0;maze.sz[3][7]= 1;maze.sz[3][8]= 1;maze.sz[3][9]= 0;maze.sz[4][0]= 0;maze.sz[4][1]= 1;maze.sz[4][2]= 0;maze.sz[4][3]= 0;maze.sz[4][4]= 0;maze.sz[4][5]= 1;maze.sz[4][6]= 1;maze.sz[4][7]= 1;maze.sz[4][8]= 1;maze.sz[4][9]= 0;maze.sz[5][0]= 0;maze.sz[5][1]= 1;maze.sz[5][2]= 1;maze.sz[5][3]= 1;maze.sz[5][4]= 0;maze.sz[5][5]= 1;maze.sz[5][6]= 1;maze.sz[5][7]= 0;maze.sz[5][8]= 1;maze.sz[5][9]= 0;maze.sz[6][0]= 0;maze.sz[6][1]= 1;maze.sz[6][2]= 0;maze.sz[6][3]= 1;maze.sz[6][4]= 1;maze.sz[6][5]= 1;maze.sz[6][6]= 0;maze.sz[6][7]= 1;maze.sz[6][8]= 1;maze.sz[6][9]= 0;maze.sz[7][0]= 0;maze.sz[7][1]= 1;maze.sz[7][2]= 0;maze.sz[7][3]= 0;maze.sz[7][4]= 0;maze.sz[7][5]= 1;maze.sz[7][6]= 0;maze.sz[7][7]= 0;maze.sz[7][8]= 1;maze.sz[7][9]= 0;maze.sz[8][0]= 0;maze.sz[8][1]= 0;maze.sz[8][2]= 1;maze.sz[8][3]= 1;maze.sz[8][4]= 1;maze.sz[8][5]= 1;maze.sz[8][6]= 1;maze.sz[8][7]= 1;maze.sz[8][8]= 1;maze.sz[8][9]= 0;maze.sz[9][0]= 0;maze.sz[9][1]= 0;maze.sz[9][2]= 0;maze.sz[9][3]= 0;maze.sz[9][4]= 0;maze.sz[9][5]= 0;maze.sz[9][6]= 0;maze.sz[9][7]= 0;maze.sz[9][8]= 0;maze.sz[9][9]= 0;int i,j,sum;for (i = 0; i < 10; i++) {for (j = 0; j < 10; j++){printf("%4d",maze.sz[i][j]);sum++;}if(sum%10==0)printf("\n");}printf("\n");printf("---请输入1求解路径图:");int a;scanf("%d",&a);if(a==1){zuobiao rukou,chukou;rukou.r=1;rukou.c=1;chukou.r=8;chukou.c=8;mazePath(maze,rukou,chukou);printf("\n");printf("---图解如下所示:(说明:0表示墙;1表示可以通过;4表示走不通;9表示所走的路径)\n");for (i = 0; i < 10; i++) {for (j = 0; j < 10; j++){printf("%4d",maze.sz[i][j]);sum++;}if(sum%10==0)printf("\n");}}}。

数据结构迷宫算法实现c语言

数据结构迷宫算法实现c语言

数据结构迷宫算法实现c语⾔迷宫问题求解是⼀个⾮常经典的算法问题,该问题要求程序能根据⽤户的输⼊的长和宽去初始化迷宫,接着给⽤户提供两个选择,⽤户可以选择在迷宫⾥⼿动或⾃动⽣成指定个数的障碍,接着程序会⾃动找到⼀条能够从⼊⼝⾛到出⼝的路径,并且输出该路径下⾯开始分析,因为迷宫是由多个点组成的,那么要实现上述功能,我们可以定义⼀个结构体去存放每个点的横纵坐标去表⽰位置,还需要⽤到⼀个⼆维数组去存放迷宫,在迷宫⾥有三种状态,0代表通路,1代表障碍,2代表已经⾛过的路,那么可以将指定的值⼀⼀赋给数组中每个元素,迷宫⾥的点是需要⽤坐标去表⽰的,那么为了⽅便,可以将⼆维数组下标(横坐标或纵坐标)为0的点(及迷宫的外围)都设置为1(障碍),为了防⽌找路时⾛出去,⾛过的路(⾛过的每个坐标)需要⽤到⼀个栈去存放每个点,栈其实就是⼀段内存,有两个指针⼀开始都指向数组的头地址(也能理解为栈底),接着随着数据的存放,栈顶指针会跟着存放的数据移动,栈底指针不变,那么根据这两个指针就可以随时确定栈顶元素的位置和栈的状态(空或满),因为栈这种特殊的数据结构可以保证后进⼊的数据先出来,所以栈在迷宫找路是可以模拟出⾛过的每⼀步以及遇到障碍时往后退的上⼀步位置(也就是后进⼊的栈顶元素),所以可以创建⼀个栈,⾥⾯的指针类型为定义的结构体类型2.详细设计⾸先根据⽤户输⼊的长和宽m和n⽤new去开辟⼤⼩为m+2(算上围墙)⼤⼩的内存,在m+2的基础上再⽤new开放n+2(算上围墙)⼤⼩的内存,就开辟了⼆维数组空间,返回的值(数组的地址)⽤⼀个⼆重指针去存放:具体代码如下(该函数在function.h)int **initmaze(int &m,int &n)//⽤0或1输⼊代表迷宫,0代表通路{cout << "请输⼊迷宫的长和宽" << endl;cout << "长度:";cin >> m;cout << "宽度:";cin >> n;cout << "请创建迷宫,0代表通路,1代表此路不通" << endl;int **maze = new int *[n + 2];//⽤new,避免缓冲区溢出for (int i = 0; i <= n + 1; i++)//创建迷宫储存空间,为迷宫设置障碍{maze[i] = new int[m+2];//长度加2,为迷宫周围设置障碍}for (int i = 0; i <= n + 1; i++){maze[i][0] = maze[i][m + 1] = 1;//为每⼀⾏的第⼀个和最后⼀个元素初始化为1,为迷宫的障碍}for (int i = 0; i <= m + 1; i++){maze[0][i] = maze[n + 1][i] = 1;//为每⼀列的第⼀个和最后⼀个元素初始化值为1,为迷宫障碍}for (int i = 1; i <= n; i++){for (int j = 1; j <= m; j++){maze[i][j]=0;}}return maze;}在stack.h这个头⽂件定义栈这种数据结构,定义结构体position⽤来存放迷宫⾥点的坐标,代码如下:struct position{int row;//⾏偏移int col;//列偏移};//定义⼀个结构体,⽤来存放位置坐标typedef position selemtype;typedef struct//定义栈结构为结构体栈,⽤来存放迷宫中某⼀点的横纵坐标{selemtype *top;//栈顶指针selemtype *base;//栈底指针int stacksize;}sqstack;定义initstack函数初始化栈,具体操作⽤new开辟⼀段内存,将这段内存的⾸地址赋值给top和base(两个指向position结构体类型的指针)⽤来表⽰存放路径的栈:bool initstack(sqstack &s)//顺序栈的初始化{s.base = new selemtype[MAXSIZE];//为顺序栈分配空间if (!s.base) return 0;//储存分配失败s.top = s.base;s.stacksize = MAXSIZE;return 1;}定义⼀些函数去对栈进⾏操作该函数将⾛过的点存放到栈⾥⾯,将栈顶指针重新向上移⼀位,指向栈顶元素bool push(sqstack &s, selemtype e)//插⼊元素e为栈顶元素{if (s.top - s.base == s.stacksize) exit(0);//空间已满,分配失败*s.top = e;//将值赋给栈顶指针s.top++;//栈顶指针向上移1位return 1;}该函数删除栈顶元素,即将栈顶指针向下移⼀位(在迷宫⾥表⽰遇到障碍退路):bool pop(sqstack &s, selemtype &e)//删除栈顶元素{if (empty(s)) return 0;//栈为空,不能删除e = *(s.top-1);//将栈顶指针减⼀,将栈顶元素赋给es.top--;return 1;}该函数取得栈顶元素,及取回top指针指向的元素(在迷宫⾥表⽰退到上⼀位置,因为栈顶元素就是对应上⼀步)该函数判断栈是否为满,根据指针位置判断bool full(sqstack &s)//判断栈是否满了{if (s.top - s.base == 0)return 0;else return 1;}该函数判断栈是否为空,根据指针位置判断bool empty(sqstack &s)//判断栈是否为空{if (s.base == s.top)return 1;else return 0;}该函数输出栈中元素,表⽰输出迷宫从⼊⼝到出⼝的路径void stackprint(sqstack s)//输出栈中元素{selemtype *q;for (q = s.base; q !=s.top; q++){cout << "("<<q->row << "," <<q->col<<")"<< endl;}}以上对栈的操作都放⼊stack.h头⽂件中上述实现了迷宫需要⽤到的⼀些数据类型和数据结构接下来分析如何实现迷宫问题⽐如以下是⼀个迷宫,长和宽为4,旁边代表围墙,⼊⼝为(1,1),⾸先要⽣成障碍,有两个选择,⼿动和⾃动⽣成,其实没区别,只需要把障碍对应的坐标设置为1即可,⾃动就是在指定的长宽内去⽣成随机数,⼀下为⾃动和⼿动的代码实现int **randmaze(int **p, int &m, int &n)//随机产⽣障碍{time_t t=time(0);srand(t);int num, x, y;cout << "请输⼊障碍物的个数"<<endl;cin >> num;cout << "ok,正在为你⽣出障碍物....请稍等" << endl;for (int i = 0; i < num; i++){x = rand() % m;//⽣成的随机数在指定迷宫长度的范围内,不包括出⼝y = rand() % n;//⽣成随机数在指定迷宫宽度的范围内p[x][y] = 1;//设置障碍}return p;}int **inputmaze(int **p, int &m, int &n)//⼿动输⼊障碍{int num, x, y;cout << "请输⼊设置障碍物的个数" << endl;cin >> num;cout << "请输⼊障碍物的位置,⾏和列" << endl;for (int i = 0; i < num; i++){cout << "⾏:";cin >> x;cout << "列:";cin >> y;while ((x<=1 || x >=n) && (y <= 1 || y >=m))//出⼝⼊⼝均不能有障碍{cout << "输⼊不在范围内" << endl;cout << "⾏:";cin >> x;cout << "列:";cin >> y;}p[x][y] = 1;}return p;}设置好障碍后就开始找路,每个点都有四个选择,及向上下左右,那么可以⽤结构体去存放相应的偏移量,⽐如右偏移为⾏为0,列偏移为1position offset[4];//结构体数组,存放位置偏移量offset[0].row = 0; offset[0].col = 1;//右偏移offset[1].row = 1; offset[1].col = 0;//下偏移offset[2].row = 0; offset[2].col = -1;//左偏移offset[3].row = -1; offset[3].col = 0;//上偏移这个顺序是有要求的先向右尝试,然后是下,再左,最后上假设⽣成的障碍为如下所⽰先从⼊⼝(1,1)当前位置向右尝试,不⾏(右为1障碍),于是向下(可以,因为下个位置为0),⾛到(2,1),将(1,1)设为2(表⽰来过,防⽌再次⾛),然后将(1,1)存⼊栈,接着(2,2)⼜有4种尝试,先向右(右(2,2)为0,所以可以⾛)于是将(1,2)设为2表⽰⾛过并存⼊栈中,接着到(2,2),先向右尝试,(2,3)为1,遇到障碍,再向下尝试,还是障碍,接着上和左都不⾏,于是只能后退了,于是将上个位置(1,2)从栈中弹出来,将上个位置变成当前位置,接着因为(1,2)已经向右尝试过了不⾏,于是要从下(结构体下标为1offset[1].row = 1; offset[1].col = 0;//下偏移)开始尝试,向下可以,于是到(1,3),将(1,2)压⼊栈,下⾯都是按照上⾯讲的⼀⼀去尝试,直到⾛到出⼝,接着将栈输出即可,该找路部分实现代码如下bool findpath(int **p,int &m,int &n,sqstack &path)//sqstack为存放路径的结构体栈{initstack(path);position offset[4];//结构体数组,存放位置偏移量offset[0].row = 0; offset[0].col = 1;//右偏移offset[1].row = 1; offset[1].col = 0;//下偏移offset[2].row = 0; offset[2].col = -1;//左偏移offset[3].row = -1; offset[3].col = 0;//上偏移position here;//⽤来存放位置here.row = here.col = 1;p[1][1] = 2;//⼊⼝设为2,防⽌在回来int option = 0;//移动⽅向,根据移动⽅向进⾏不同的偏移int lastoption = 3;while (here.row != n||here.col != m)//没到出⼝{int r, c;while (option <= lastoption)//依次⾛⼏个⽅向{r = here.row + offset[option].row;c = here.col + offset[option].col;if (p[r][c] == 0) break;//如果有通路,则跳出option++;//否则尝试下⼀个⽅向}if (option <= lastoption)//如果找到⽅向{push(path, here);//将⽅向压⼊结构体栈here.row = r;here.col = c;p[r][c] = 2;//将该点改为2,表⽰来过option = 0;//重新设置为0,进⾏下⼀次寻路}else{position next;if (empty(path)){return false;}next = gettop(path);//取栈顶元素,及前⼀点坐标pop(path, next);//将栈顶弹出if (here.row == next.row)//如果当前位置和上⼀位置⾏相等,说明他们在列上移{if (here.col > next.col){option = 1;}else{option = 3;}//option = 2 + next.col - here.col;//下⼀个移动位置}else{if (here.row > next.row){option = 2;}else{return false;}//option = 3 + next.row - here.row;//如果当前位置和上⼀位置列相同,说明当前位置是从⾏上移过来的}here = next;//把栈顶元素(上⼀位置坐标赋给当前位置,表⽰退回来)}}return true;}具体代码在此贴出#ifndef _STACK0_#define_STACK0_#define MAXSIZE 100struct position{int row;//⾏偏移int col;//列偏移};//定义⼀个结构体,⽤来存放位置坐标typedef position selemtype;typedef struct//定义栈结构为结构体栈,⽤来存放迷宫中某⼀点的横纵坐标{selemtype *top;//栈顶指针selemtype *base;//栈底指针int stacksize;}sqstack;bool full(sqstack &s)//判断栈是否满了{if (s.top - s.base == 0)return 0;else return 1;}bool empty(sqstack &s)//判断栈是否为空{if (s.base == s.top)return 1;else return 0;}bool initstack(sqstack &s)//顺序栈的初始化{s.base = new selemtype[MAXSIZE];//为顺序栈分配空间if (!s.base) return 0;//储存分配失败s.top = s.base;s.stacksize = MAXSIZE;return 1;}bool push(sqstack &s, selemtype e)//插⼊元素e为栈顶元素{if (s.top - s.base == s.stacksize) exit(0);//空间已满,分配失败*s.top = e;//将值赋给栈顶指针s.top++;//栈顶指针向上移1位return 1;}bool pop(sqstack &s, selemtype &e)//删除栈顶元素{if (empty(s)) return 0;//栈为空,不能删除e = *(s.top-1);//将栈顶指针减⼀,将栈顶元素赋给es.top--;return 1;}selemtype gettop(sqstack s)//获取栈顶元素的值{if (s.top == s.base) exit(0);//e=*(s.top - 1);//取栈顶元素return *(s.top-1);}void stackprint(sqstack s)//输出栈中元素{selemtype *q;for (q = s.base; q !=s.top; q++){cout << "("<<q->row << "," <<q->col<<")"<< endl;}}#endif;#ifndef _FUNCTION0_#define_FUNCTION0_#include<iomanip>#include<cstdlib>//⽤来⽣成随机数#include<ctime>#include"stack.h"void welcome(){cout << "初始化迷宫......" << endl;}int **initmaze(int &m,int &n)//⽤0或1输⼊代表迷宫,0代表通路{cout << "请输⼊迷宫的长和宽" << endl;cout << "长度:";cin >> m;cout << "宽度:";cin >> n;cout << "请创建迷宫,0代表通路,1代表此路不通" << endl;int **maze = new int *[n + 2];//⽤new,避免缓冲区溢出for (int i = 0; i <= n + 1; i++)//创建迷宫储存空间,为迷宫设置障碍{maze[i] = new int[m+2];//长度加2,为迷宫周围设置障碍}for (int i = 0; i <= n + 1; i++){maze[i][0] = maze[i][m + 1] = 1;//为每⼀⾏的第⼀个和最后⼀个元素初始化为1,为迷宫的障碍}for (int i = 0; i <= m + 1; i++){maze[0][i] = maze[n + 1][i] = 1;//为每⼀列的第⼀个和最后⼀个元素初始化值为1,为迷宫障碍}for (int i = 1; i <= n; i++){for (int j = 1; j <= m; j++){maze[i][j]=0;}}return maze;}int **randmaze(int **p, int &m, int &n)//随机产⽣障碍{time_t t=time(0);srand(t);int num, x, y;cout << "请输⼊障碍物的个数"<<endl;cin >> num;cout << "ok,正在为你⽣出障碍物....请稍等" << endl;for (int i = 0; i < num; i++){x = rand() % m;//⽣成的随机数在指定迷宫长度的范围内,不包括出⼝y = rand() % n;//⽣成随机数在指定迷宫宽度的范围内p[x][y] = 1;//设置障碍}return p;}int **inputmaze(int **p, int &m, int &n)//⼿动输⼊障碍{int num, x, y;cout << "请输⼊设置障碍物的个数" << endl;cin >> num;cout << "请输⼊障碍物的位置,⾏和列" << endl;for (int i = 0; i < num; i++){cout << "⾏:";cout << "列:";cin >> y;while ((x<=1 || x >=n) && (y <= 1 || y >=m))//出⼝⼊⼝均不能有障碍{cout << "输⼊不在范围内" << endl;cout << "⾏:";cin >> x;cout << "列:";cin >> y;}p[x][y] = 1;}return p;}void printmaze(int **p,int m,int n){for (int i = 0; i <= n + 1; i++){for (int j = 0; j <= m + 1; j++){if (p[i][j] == 1){cout << setw(2) <<"□";}if (p[i][j] == 2){cout << setw(2) << "○";}if (p[i][j] == 0){cout << setw(2) << "";}}cout << endl;}}void delmaze(int **p, int m, int n)//销毁迷宫{for (int i = 0; i <= n + 1; i++){delete[] p[i];}}bool findpath(int **p,int &m,int &n,sqstack &path)//sqstack为存放路径的结构体栈{initstack(path);position offset[4];//结构体数组,存放位置偏移量offset[0].row = 0; offset[0].col = 1;//右偏移offset[1].row = 1; offset[1].col = 0;//下偏移offset[2].row = 0; offset[2].col = -1;//左偏移offset[3].row = -1; offset[3].col = 0;//上偏移position here;//⽤来存放位置here.row = here.col = 1;p[1][1] = 2;//⼊⼝设为2,防⽌在回来int option = 0;//移动⽅向,根据移动⽅向进⾏不同的偏移int lastoption = 3;while (here.row != n||here.col != m)//没到出⼝{int r, c;while (option <= lastoption)//依次⾛⼏个⽅向{r = here.row + offset[option].row;c = here.col + offset[option].col;if (p[r][c] == 0) break;//如果有通路,则跳出option++;//否则尝试下⼀个⽅向}if (option <= lastoption)//如果找到⽅向{push(path, here);//将⽅向压⼊结构体栈here.row = r;here.col = c;p[r][c] = 2;//将该点改为2,表⽰来过option = 0;//重新设置为0,进⾏下⼀次寻路}else{position next;if (empty(path)){return false;}next = gettop(path);//取栈顶元素,及前⼀点坐标pop(path, next);//将栈顶弹出if (here.row == next.row)//如果当前位置和上⼀位置⾏相等,说明他们在列上移{if (here.col > next.col){option = 1;}else{option = 3;}//option = 2 + next.col - here.col;//下⼀个移动位置}else{if (here.row > next.row){option = 2;}else{return false;}//option = 3 + next.row - here.row;//如果当前位置和上⼀位置列相同,说明当前位置是从⾏上移过来的}here = next;//把栈顶元素(上⼀位置坐标赋给当前位置,表⽰退回来)}}return true;}#endif;#include<iostream>using namespace std;#include"function.h"int main(){int m, n,t;int **maze;sqstack path;//⽤来存放路径welcome();maze=initmaze(m,n);//初始化函数printmaze(maze,m,n);//输出初始化的迷宫cout << "选择1⾃动⽣成障碍" << endl;cout << "选择2⼿动创建障碍" << endl;cin >> t;while (t != 1 && t != 2){cout << "输⼊错误,请重输" << endl;cin >> t;}switch (t){case 1:maze = randmaze(maze, m, n); break; case 2:maze = inputmaze(maze, m, n); break; }cout << "迷宫如下"<<endl;printmaze(maze,m,n);cout << "正在寻找路径" << endl;if (findpath(maze, m, n,path)){stackprint(path);}else{cout << "没有找到路径" << endl;}printmaze(maze,m,n);delmaze(maze, m, n);//销毁迷宫,释放内存return 0;}。

用栈解决迷宫问题

用栈解决迷宫问题

⽤栈解决迷宫问题⼀、因为栈是后进先出的特性,所以说⼀般⽤栈都是通过dfs来解决迷宫问题。

如果⽤队列的话就是通过bfs来解决。

⼆、c++代码:1 #include<iostream>2 #include<cstdio>3 #include<stdio.h>4 #include<string.h>5 #include<windows.h>6using namespace std;7const int maxn=1005;8#define MaxSize 100005 //栈最多元素个数9int M=4,N=4;10int w[6][6]=11 {12 {1,1,1,1,1,1}13 ,{1,0,0,0,1,1}14 ,{1,0,1,0,0,1}15 ,{1,0,0,0,1,1}16 ,{1,1,0,0,0,1}17 ,{1,1,1,1,1,1}18 };19int mg[maxn][maxn];20char s[maxn][maxn];21struct migong22 {23int i; //路径横坐标24int j; //路径纵坐标25int di; //⽅向26 } Stack[MaxSize],Path[MaxSize]; //定义栈和存放最短路径的数组27int top=-1; //栈顶指针28int counts=1; //路径数计数29int minlen=MaxSize; //最短路径长度30void mgpath() //路径为:(1,1)->(M,N)31 {32int i,j,di,finds,k;33 top++;34 Stack[top].i=1;35 Stack[top].j=1;36 Stack[top].di=-1;37 mg[1][1]=-1; //初始结点进栈38while(top>-1) //栈不空时循环39 {40 i=Stack[top].i;41 j=Stack[top].j;42 di=Stack[top].di;43if(i==M && j==N) //找到了出⼝,输出路径44 {45// cout<<counts<<": ";46// counts++;47// for(k=0; k<=top; k++)48// {49// cout<<"("<<Stack[k].i<<","<<Stack[k].j<<")"<<" ";50//51// }52// cout<<endl;53if(top+1<minlen) //⽐较输出最短路径54 {55for(k=0; k<=top; k++)56 Path[k]=Stack[k];57 minlen=top+1;58 }59 mg[Stack[top].i][Stack[top].j]=0; //让该位置变为其他路径的可⾛结点60 top--;61 i=Stack[top].i;62 j=Stack[top].j;63 di=Stack[top].di;64 }65 finds=0;66while(di<4 && finds==0) //找下⼀个可⾛结点67 {68 di++;69switch(di)70 {71case0:72 i=Stack[top].i-1;73 j=Stack[top].j;74break; //上⾯75case1:76 i=Stack[top].i;77 j=Stack[top].j+1;78break; //右边79case2:80 i=Stack[top].i+1;82break; //下⾯83case3:84 i=Stack[top].i;85 j=Stack[top].j-1;86break; //左边87 }88if(mg[i][j]==0) //因为地图外边围了⼀层墙,所以不需要判断边界89 finds=1;90 }91if(finds == 1) //找到了下⼀个可⾛结点92 {93 Stack[top].di=di; //修改原栈顶元素的di值94 top++; //下⼀个可⾛结点进栈95 Stack[top].i=i;96 Stack[top].j=j;97 Stack[top].di=-1;98 mg[i][j]=-1; //避免重复⾛到该结点99 }100else101 {102 mg[Stack[top].i][Stack[top].j]=0; //让该位置变为其他路径的可⾛结点103 top--;104 }105 }106 cout<<"最短路径如下(输出结果以坐标显⽰)"<<endl;107 cout<<"长度: "<<minlen<<endl;108 cout<<"路径: "<<endl;109for(k=0; k<minlen; k++)110 {111 cout<<"("<<Path[k].i<<","<<Path[k].j<<")"<<"";112 }113 }114int main()115 {116int x;117while(1)118 {119 system("cls");120 printf ( " 迷宫系统 \n");121 printf ( " \n");122 printf ( " \n");123 printf ("-------------------------------------- \n");124 printf ("--------------------------------------\n");125 printf ("--------⼁[0]重构地图⼁---\n");126 printf ("--------⼁[1]使⽤默认地图⼁---\n");127 printf ("--------⼁[2]结束⼁---\n");128 printf ("----------输⼊相应数字----------------\n");129 printf ("--------------------------------------- \n");130 printf ( " \n");131 printf ( " \n");132 scanf("%d",&x);133if(x==0)134 {135 system("cls");136 printf(" 重构地图\n");137 printf("输⼊内容请以空格或者换⾏分隔开,且0代表此处可⾛,1代表此处不可⾏\n"); 138 printf("\n现在请输⼊地图是⼏⾏⼏列\n");139int n,m;140 memset(mg,0,sizeof(mg));141 scanf("%d%d",&n,&m);142int flag=0;143 printf("\n请输⼊地图,请保证左上⾓和右下⾓都为0\n");144for(int i=1; i<=n; ++i)145 {146147 scanf("%s",s[i]+1);148 mg[i][0]=mg[i][m+1]=1;149 }150for(int j=1; j<=m; ++j)151 {152 mg[0][j]=mg[n+1][j]=1;153 }154for(int i=1;i<=n;++i)155 {156for(int j=1;j<=m;++j)157 {158 mg[i][j]=s[i][j]-'0';159 }160 }161 M=n;162 N=m;163164//cout<<"迷宫所有路径如下:"<<endl;165 mgpath();166 system("pause");167 }168else if(x==1)169 {171 M=N=4;172for(int i=0; i<6; ++i) 173 {174for(int j=0; j<6; ++j) 175 {176 mg[i][j]=w[i][j]; 177 }178 }179 mgpath();180 system("pause"); 181 }182else break;183 }184return0;185 }View Code。

数据结构C语言版 非循环顺序队列求解迷宫问题

数据结构C语言版 非循环顺序队列求解迷宫问题

数据结构C语言版非循环顺序队列求解迷宫问题利用非循环顺序队列采用广度搜索法求解迷宫问题(一条路径)编译环境:Dev-C++ 4.9.9.2日期:2011年2月12日*/#include <stdio.h>#include <malloc.h>#define M 5 // 迷宫行数(包括外墙)#define N 5 // 迷宫列数(包括外墙)#define D 4 // 移动方向数,只能取4和8。

(8个,可斜行;4个,只可直走)// 移动数组,移动方向由正东起顺时针转struct{int x,y;#if D==8}move[D]={{0,1},{1,1},{1,0},{1,-1},{0,-1},{-1,-1},{-1,0},{-1,1}}; #endif#if D==4}move[D]={{0,1},{1,0},{0,-1},{-1,0}};#endif// 定义栈元素类型和队列元素类型,两者为相同类型。

typedef struct{int x,y; // 当前点的行值,列值int pre; // 前一点在队列中的序号} SElemType, QElemType;#define STACK_INIT_SIZE 10 // 存储空间初始分配量#define STACKINCREMENT 2 // 存储空间分配增量// 栈的顺序存储表示 P46typedef struct SqStack{SElemType *base; // 在栈构造之前和销毁之后,base的值为NULL SElemType *top; // 栈顶指针int stacksize; // 当前已分配的存储空间,以元素为单位}SqStack; // 顺序栈// 顺序队列(非循环,因为是非循环的,所以需要判断是否溢出#define MAXQSIZE 5 // 最大队列长度(对于循环队列,最大队列长度要减1) typedef struct{QElemType *base;// 初始化的动态分配存储空间相当于一个数组// 头指针,若队列不空,指向队列头元素,相当于一个数组下标int front;// 尾指针,若队列不空,指向队列尾元素的下一个位置相当于一个数组下标int rear;}SqQueue;// 构造一个空队列Qint InitQueue(SqQueue *Q){//分配定长的空间,相当于一个数组(*Q).base=(QElemType *)malloc(MAXQSIZE*sizeof(QElemType));if(!(*Q).base) // 存储分配失败exit(0);(*Q).front=(*Q).rear=0; //初始化下标return 1;}// 销毁队列Q,Q不再存在int DestroyQueue(SqQueue *Q){if((*Q).base)free((*Q).base);(*Q).base=NULL;(*Q).front=(*Q).rear=0;return 1;}// 若队列Q为空队列,则返回1,否则返回0int QueueEmpty(SqQueue Q){if(Q.front==Q.rear) // 队列空的标志return 1;else}// 插入元素e为Q的新的队尾元素int EnQueue(SqQueue *Q,QElemType e){if((*Q).rear>=MAXQSIZE){ // 队列满,增加1个存储单元(*Q).base=(QElemType *)realloc((*Q).base,((*Q).rear+1)*sizeof(QElemType));if(!(*Q).base) // 增加单元失败return 0;}*((*Q).base+(*Q).rear)=e;(*Q).rear++;return 1;}// 若队列不空,则删除Q的队头元素,用e返回其值,并返回1,否则返回0int DeQueue(SqQueue *Q,QElemType *e){if((*Q).front==(*Q).rear) // 队列空return 0;*e=(*Q).base[(*Q).front];(*Q).front=(*Q).front+1;return 1;}// 构造一个空栈S。

栈的迷宫求解(数据结构试验)

栈的迷宫求解(数据结构试验)

实验二:迷宫问题班级:姓名:学号:一、需求分析(1 )以二维数据Maze[m+2][n+2] 表示迷宫,其中:Maze[0][j] 和Maze[m+1][j](0<=j<=n+1)及Maze[i][0]和Maze[i][n+1](0<=i<=m+1)为添加一圈障碍。

数组中以元素值为0 表示通路,1 表示障碍,限定迷宫的大小m,n<=100。

(2)用户输入迷宫的规模m,n;并按照此规模输入迷宫的具体数据。

(3)迷宫的入口位置和出口位置可由用户随时设定。

(4)若设定的迷宫存在通路,则以长方阵形式将迷宫及其通路输出到标准输出文件(即终端)上,其中,字符“#”表示障碍,字符“*”表示路径上的位置,字符“@”表示“死胡同”,即曾途径然而不能到达出口的位置,余者用空格符印出。

若设定的迷宫不存在通路,则报告相应信息。

(5)本程序只求出一条成功的通路。

然而,只需要对迷宫求解的函数作小量修改,便可求得全部路径。

(6)测试数据见原题,当入口位置为(1,1),出口位置为(9,8)时,输出数据应为:* * # @ @ @ #* # @ @ @ #* * @ @ # # #* # # # # @* * * # * * * @# * * * # * ## # # # * ## # # * ## # * *(7)程序执行的命令为:1)创建迷宫;2)求解迷宫;3)输出迷宫的解。

二、概要设计1. 设定栈的抽象数据类型定义:ADT Stack{数据对象:D={a i|a i∈CharSet,i=1,2,…,n,n>=0}数据关系:R1={<a i-1,a i>|a i-1,a i∈D,i=2,…,n}基本操作:InitStack(&S)操作结果:构造一个空栈S。

DestroyStack(&S)初始条件:栈S 已存在。

操作结果:销毁栈S。

ClearStack(&S)初始条件:栈S 已存在。

C语言数据结构迷宫问题

C语言数据结构迷宫问题

#include <stdio.h>#include <stdlib.h>#include <time.h>#define M 20#define N 20#define visited 2#define TRUE 1#define FALSE 0#define INITSIZE 100typedef int Status;typedef struct{ //坐标点结构体int y; //每个可通的行坐标int x; //每个可通的列坐标}PosType;typedef struct{int ord; //通道块在路径上的“序号”int di; //从此通道块走向下一通道块的“方向”PosType seat; //通道块在迷宫中的“坐标位置”}MazeNode; //迷宫节点typedef struct {MazeNode base[INITSIZE];int top; //栈顶指针}Stack;typedef struct{ //用于存储迷宫的路径PosType coor[INITSIZE];int top;}Postion;void RandMatrix(); //随机生成迷宫int InitStack(Stack *); //初始化栈int InitStack1(Postion *);int StackEmpty(Stack *); //判断栈是否为空int StackEmpty1(Postion *);int StackIsFull(Stack *); //判断栈是否满了int StackIsFull1(Postion *); //判断栈是否满了int Push(Stack *s,MazeNode m); //压栈int Push1(Postion *,PosType);int Pop(Stack *s,MazeNode *m); //出栈int Pop1(Postion *,PosType *);int DestroyStack(Stack *s); //撤销栈int Pass(PosType pos); //判断指定坐标是否可通过int FootPrint(PosType pos); //标记能通过的PosType NextCoord(PosType pos,int i); //获取下一位置int MarkPrint(PosType pos); //留下不能通过的标记,并退回一步int MazePath(PosType start,PosType end,Postion *); //从迷宫的入口到出口查找void PrintMaze(Postion *); //输出迷宫int mg[M][N]; //生成一个M*N 的迷宫int main(){int h=1;PosType start,end;Postion P;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.x>N || start.y>M){printf("输入的坐标越界,请重新输入!\n");continue;}}while(start.x>N || start.y>M);do //输入迷宫出口坐标{printf("\n输入迷宫出口坐标:");scanf("%d%d",&end.x,&end.y);if(end.x>N || end.y>M){printf("输入的坐标越界,请重新输入!\n");continue;}}while(end.x>N || end.y>M);if(!MazePath(start,end,&P)) //调用函数查找路径{printf("\n无法通过!\n");}else{PrintMaze(&P); //打印找到的路径}return 0;}int InitStack(Stack *s){s->top=-1;return 1;}int InitStack1(Postion *s){s->top=-1;return 1;}int StackEmpty(Stack *s){if(s->top==-1)return 1;return 0;}int StackEmpty1(Postion *s){if(s->top==-1)return 1;return 0;}int StackIsFull(Stack *s){if(s->top==INITSIZE-1)return 1;elsereturn 0;}int StackIsFull1(Postion *s){if(s->top==INITSIZE-1)return 1;elsereturn 0;}int Push(Stack *s,MazeNode m) {if(!StackIsFull(s)){s->top++;s->base[s->top]=m;}return 1;}int Push1(Postion *s,PosType m) {if(!StackIsFull1(s)){s->top++;s->coor[s->top]=m;}return 1;}int Pop(Stack *s,MazeNode *m) {if(s->top!=-1){*m=s->base[s->top];s->top--;return 1;}return 1;}int Pop1(Postion *s,PosType *m) {if(s->top!=-1){*m=s->coor[s->top];s->top--;return 1;}return 1;}int DestroyStack(Stack *s){s->top=-1;return 1;}int Pass(PosType pos) //判断指定坐标是否可通过{if(mg[pos.y][pos.x]==0) //可通return 1;elsereturn 0;}int FootPrint(PosType pos) //标记能通过的{mg[pos.y][pos.x]=2; //2表示可通return 1;}PosType NextCoord(PosType pos,int i) //获取下一位置{switch(i) //1,2,3,4,5,6,7,8代表方向顺时针{case 1:pos.x+=1; //向右侧查找break;case 2:pos.x+=1;pos.y+=1;break;case 3:pos.y+=1;break;case 4:pos.y+=1;pos.x-=1;break;case 5:pos.x-=1;break;case 6:pos.x-=1;pos.y-=1;break;case 7:pos.y-=1;break;case 8:pos.y-=1;pos.x+=1;break;default :exit(0);}return pos;}int MarkPrint(PosType pos) //留下不能通过的标记,并退回一步{mg[pos.y][pos.x]=3; //3表示曾走过,但不通return 1;}void RandMatrix(){int i=0,j=0;srand((unsigned)time(NULL));for(i=0;i<M;i++)for(j=0;j<N;j++)mg[i][j]=rand()%2;i=0;for(j=0;j<N;j++){mg[i][j]=1;mg[j][i]=1;}i=N-1;for(j=0;j<M;j++){mg[j][i]=1;mg[i][j]=1;}mg[1][1]=0;mg[M-2][N-2]=0;printf("\n");for(i=0;i<M;i++){for(j=0;j<N;j++){if(mg[i][j]==1) //若是障碍{printf("█");}else if(mg[i][j]==2) //若是可通路径{printf("◎");}else if(mg[i][j]==3){printf("☆"); //其他位置}elseprintf(" ");}printf("\n");}}int MazePath(PosType start,PosType end,Postion *P) //从迷宫的入口到出口查找{//若迷宫maze中存在从入口start到出口end的通道,则求得一条存放在栈中(从栈底到栈顶)//并返回TRUE,否则返回FALSEStack S; //定义栈PosType curpos;int curstep; //当前序号1,2,3,4,5,6,7,8代表方向,1代表向右,后依次顺时针MazeNode e;InitStack(&S);curpos=start; //设定“当前位置”为“入口位置”,从入口位置开始查找curstep=1; //探索第一步do{if(Pass(curpos)){//从当前位置可以通过,即是未曾走到过的通道块FootPrint(curpos); //标记能通过的e.ord=curstep; //保存步数e.seat=curpos;e.di=1; //向右侧探测Push(&S,e); //加入路径Push1(P,curpos);if(curpos.y==end.x && curpos.x==end.y) //若当前位置是出口坐标{DestroyStack(&S); //释放栈占用的空间return 1; //返回查找成功}else //与出口坐标不同{curpos=NextCoord(curpos,1); //向右侧探测curstep++; //探索下一步}}else //当前位置不能通过(为障碍或已走过){if(!StackEmpty(&S)) //若栈不为空,之前有走过的位置{Pop(&S,&e); //出栈(返回上一步的位置)Pop1(P,&curpos);while(e.di==8 && !StackEmpty(&S)) //上一步,四个方向都探测定,且栈不为空{MarkPrint(e.seat); //留下不能通过的标记,并退回一步Pop(&S,&e); //出栈,返回上一步Pop1(P,&curpos);}if(e.di<8){e.di++; //换下一个方向探索,准备探测下一个方向Push(&S,e); //将当前节点入栈Push1(P,curpos);curpos=NextCoord(e.seat,e.di); //设定当前位置是该新方向上的相邻块,查找下一个应该探测的方向}}}}while(!StackEmpty(&S));//程序运行到这里,表示没有能通达的路径DestroyStack(&S); //释放占用的空间return FALSE; //返回失败}void PrintMaze(Postion *P) //输出迷宫{int i,j;PosType e;Postion W;InitStack1(&W);while(!StackEmpty1(P)){Pop1(P,&e);Push1(&W,e);}printf("\n可以通过,迷宫路径:\n"); //在这里可以设置迷宫的界面for(i=0;i<M;i++){for(j=0;j<N;j++){if(mg[i][j]==1) //若是障碍{printf("█");}else if(mg[i][j]==2) //若是可通路径{printf("◎");}else if(mg[i][j]==3){printf("☆"); //其他位置}else{printf(" ");}}printf("\n");}printf("\n\n");i=1;printf("迷宫的最短路径为:");while(!StackEmpty1(&W)){i++;Pop1(&W,&e);printf("(%d,%d), ",e.y,e.x);}printf("\n\n");}。

数据结构栈的应用(迷宫求解)

数据结构栈的应用(迷宫求解)

数据结构栈的应用(迷宫求解)栈的应用迷宫求解任务:可以输入一个任意大小的迷宫数据,用非递归的方法求出一条走出迷宫的路径,并将路径输出;源代码:#include#include/*数据定义*/typedefenum { ERROR, OK } Status;typedefstruct{int row; //row表示"行"号int line; //line表示"列"号}PosType; //位置的元素类型typedefstruct{intord; //该通道在路径上的"序号"PosType seat; //通道块在迷宫中的"坐标位置"int di; //从此通道走向下以通道块的"方向"}SElemType; //栈的元素类型typedefstruct{SElemType * base;SElemType * top;intstacksize;}SqStack;/*函数原型说明*/Status InitStack(SqStack&S); //创建一个空栈SStatus Push(SqStack&S,SElemType&a); //插入新元素aStatus Pop(SqStack&S,SElemType&a); //删除栈顶元素,a返回其值Status StackEmpty(SqStack S); //检查是否空栈Status MazePath(int maze[12][12],SqStack&S, PosType start, PosType end); //找通路void Initmaze(int maze[12][12],intx,int y); //初始化迷宫void printmaze(int maze[12][12],intx,int y); //显示迷宫Status Pass(int maze[12][12],PosTypeCurPos); //判断当前位置是否可通void Markfoot(int maze[12][12], PosTypeCurPos); //标记当前位置不可通PosTypeNextPos(PosTy peCurPos, intDir); //进入下一位置void printpath(int maze[12][12],SqStackS,intx,inty,PosTypestart,PosType end); //显示通路/*主函数*/void main (void){PosTypestart,end;int t=0;SqStack S;int maze[12][12];do{if(t!=0)printf("\n");for(int i=0;i<20;i++){printf("* ");}if(t==0){printf("\n*\t欢迎来到迷宫世界\t * \n"); printf("*\t 1.设置迷宫\t\t * \n");}else{printf("\n* 请继续选择:\t\t\t * \n");printf("*\t 1.设置迷宫\t\t * \n");}printf("*\t 2.设置迷宫路径\t\t * \n");printf("*\t 3.输出迷宫通路路径\t * \n"); printf("*\t 4.结束\t\t\t *\n");t++;for(int j=0;j<20;j++){printf("* ");}printf("\n");int s;printf("请选择:");scanf("%d",&s);intaa;intx,y;switch(s){case 1://1.初始化迷宫aa=1;printf("迷宫设置:请输入\n"); //设置迷宫大小do{printf("行X(x<10)=");scanf("%d",&x);printf("列Y(y<10)=");scanf("%d",&y);if(x<1 || x>10||y<1 || y>10){printf("输入错误!\n");}}while(x<1 || x>10||y<1 || y>10);Initmaze(maze,x,y); //初始化迷宫printmaze(maze,x,y); //显示所创建的迷宫break;case 2://寻找迷宫路径if(aa==1){aa=2; //设置入口和出口do{printf("输入入口行坐标:");scanf("%d",&start.row); if(start.row>x)printf("输入错误!\n");}while(start.row>x);do{printf("输入入口列坐标:");scanf("%d",&start.line); if(start.line>y)printf("输入错误!\n");}while(start.line>y);do{printf("输入出口行坐标:");scanf("%d",&end.row); if(end.row>x)printf("输入错误!\n");}while(end.row>x);do{printf("输入出口列坐标:");scanf("%d",&end.line);if(end.line>y)printf("输入错误!\n");}while(end.line>y);}elseprintf("请先初始化迷宫!\n");printf("\n所设置入口坐标为(%d,%d),出口坐标为(%d,%d).\n",start.row,start.line,end.row,end.line);break;case 3://输出此迷宫通路路径if(aa==2){aa=3;if(MazePath(maze,S,start,end)) //若有通路,显示通路printpath(maze,S,x,y,start,end);elseprintf("\n抱歉,找不到通路!\n\n");elseprintf("请先初始化迷宫并寻找路径!\n");break;case 4:exit(0);break;default:exit(0);}}while(1);}/*若迷宫maze中从入口start到出口end的通道,则求得一条存放在栈中*/Status MazePath(int maze[12][12],SqStack&S, PosType start, PosType end){PosTypecurpos;intcurstep;SElemType e;InitStack(S);curpos = start; // 设定"当前位置"为"入口位置curstep = 1; // 探索第一步do {if (Pass(maze,curpos)) // 当前位置可通过,即是未曾走到过的通道块{Markfoot(maze,curpos); // 留下足迹e.di =1;e.ord = curstep;e.seat= curpos;Push(S,e); // 加入路径if (curpos.row==end.row&&curpos.line==end.line)return OK; // 到达终点(出口)curpos = NextPos(curpos, 1); // 下一位置是当前位置的东邻curstep++; // 探索下一步}else // 当前位置不能通过{if (!StackEmpty(S)){Pop(S,e);while (e.di==4 && !StackEmpty(S)){Markfoot(maze,e.seat); // 留下不能通过的标记,并退回一步Pop(S,e);}if (e.di<4)e.di++; // 换下一个方向探索Push(S, e);curpos = NextPos(e.seat, e.di); // 当前位置设为新方向的相邻块}}}} while (!StackEmpty(S));return ERROR;}/*初始化迷宫时间复杂度:n^2*/voidInitmaze(int maze[12][12],intx,int y){char select;do{printf("创建方式A:自动生成B:手动创建\n");label: s canf("%c",&select);if(select=='a'||select=='A') //自动生成{for(int i=1;i<x+1;i++)< p="">{for(int j=1;j<y+1;j++)< p="">maze[i][j]=rand()%2;}break;}else if(select=='b'||select=='B') //手动设置{printf("按行输入%d*%d数据,0代表可通,1代表不可通(每行以Enter结束):\n",x,y);for(int i=1;i<x+1;i++)< p="">{for(int j=1;j<y+1;j++)< p="">scanf("%d",&maze[i][j]);maze[i][y+1]=1;}for(i=0;i< p="">break;}else if(select=='\n')goto label; //排除Enter键的影响elseif(select!='b'||select!='B'||select!='a'||select!='A')printf("输入错误!\n");}while(select!='b'||select!='B'||select!='a'||select!='A');}/*显示迷宫时间复杂度:n^2*/voidprintmaze(int maze[12][12],intx,int y){printf("\n\n");printf("显示所建的迷宫(#表示墙):\n");printf("%c ",'#');printf("%c ",'y');for(int j=1;j<y+1;j++)< p="">printf("%d ",j);printf("%c ",'#');printf("\nx ");for(int i=1;i<y+3;i++)< p=""> printf("%c ",'#');printf("\n");for(i=1;i<x+1;i++)< p=""> {if(i<x+1)< p="">printf("%d ",i);elseprintf("%c ",'#');printf("%c ",'#');for(int j=1;j<y+1;j++)< p=""> {printf("%d ",maze[i][j]);}printf("%c",'#');printf("\n");}for(i=0;i</y+1;j++)<></x+1)<></x+1;i++)<></y+3;i++)<></y+1;j++)<><></y+1;j++)<></x+1;i++)<></y+1;j++)<></x+1;i++)<>。

C语言数据结构之迷宫问题

C语言数据结构之迷宫问题

C语⾔数据结构之迷宫问题本⽂实例为⼤家分享了数据结构c语⾔版迷宫问题栈实现的具体代码,供⼤家参考,具体内容如下程序主要参考⾃严蔚敏⽼师的数据结构c语⾔版,在书中程序的⼤体框架下进⾏了完善。

关于迷宫问题的思路可查阅原书。

#include<iostream>using namespace std;#define MAXSIZE 10typedef int Status;typedef struct{int x;int y;}Postype;typedef struct{int ord;Postype seat;int dir;}SElemType;//栈的元素类型typedef struct{//SElemType data[MAXSIZE];SElemType* top;SElemType* base;}Stack;//栈的结构类型typedef struct{char arr[MAXSIZE][MAXSIZE];}MAZETYPE;//迷宫结构体MAZETYPE maze;void InitMaze(){maze.arr[0][0] = maze.arr[0][1] = maze.arr[0][2] = maze.arr[0][3] = maze.arr[0][4] = maze.arr[0][5] = maze.arr[0][6] = maze.arr[0][7] = maze.arr[0][8] = maze.arr[0][9] = '1'; maze.arr[1][0] = maze.arr[1][3] = maze.arr[1][7] = maze.arr[1][9] = '1';maze.arr[1][1] = maze.arr[1][2] = maze.arr[1][4] = maze.arr[1][5] = maze.arr[1][6] = maze.arr[1][8] = '0';maze.arr[2][0] = maze.arr[2][3] = maze.arr[2][7] = maze.arr[2][9] = '1';maze.arr[2][1] = maze.arr[2][2] = maze.arr[2][4] = maze.arr[2][5] = maze.arr[2][6] = maze.arr[2][8] = '0';maze.arr[3][0] = maze.arr[3][5] = maze.arr[3][6] = maze.arr[3][9] = '1';maze.arr[3][1] = maze.arr[3][2] = maze.arr[3][3] = maze.arr[3][4] = maze.arr[3][7] = maze.arr[3][8] = '0';maze.arr[4][0] = maze.arr[4][2] = maze.arr[4][3] = maze.arr[4][4] = maze.arr[4][9] = '1';maze.arr[4][1] = maze.arr[4][5] = maze.arr[4][6] = maze.arr[4][7] = maze.arr[4][8] = '0';maze.arr[5][0] = maze.arr[5][4] = maze.arr[5][9] = '1';maze.arr[5][1] = maze.arr[5][2] = maze.arr[5][3] = maze.arr[5][5] = maze.arr[5][6] = maze.arr[5][7] = maze.arr[5][8] = '0';maze.arr[6][0] = maze.arr[6][2] = maze.arr[6][6] = maze.arr[6][9] = '1';maze.arr[6][1] = maze.arr[6][3] = maze.arr[6][4] = maze.arr[6][5] = maze.arr[6][7] = maze.arr[6][8] = '0';maze.arr[7][0] = maze.arr[7][2] = maze.arr[7][3] = maze.arr[7][4] = maze.arr[7][6] = maze.arr[7][9] = '1';maze.arr[7][1] = maze.arr[7][5] = maze.arr[7][7] = maze.arr[7][8] = '0';maze.arr[8][0] = maze.arr[8][1] = maze.arr[8][9] = '0';maze.arr[8][2] = maze.arr[8][3] = maze.arr[8][4] = maze.arr[8][5] = maze.arr[8][6] = maze.arr[8][7] = maze.arr[8][8] = '0';maze.arr[9][0] = maze.arr[9][1] = maze.arr[9][2] = maze.arr[9][3] = maze.arr[9][4] = maze.arr[9][5] = maze.arr[9][6] = maze.arr[9][7] = maze.arr[9][8] = maze.arr[9][9] = '1'; }Status initStack(Stack &s){s.base = (SElemType*)malloc(MAXSIZE*sizeof(SElemType));if (!s.base) return 0;s.top = s.base;return 1;}void Push(Stack &s, SElemType e){*s.top++ = e;}void Pop(Stack &s, SElemType &e){e = *--s.top;}Status StackEmpty(Stack &s){if (s.top == s.base) return 1;else return 0;}Status Pass(Postype curpos){if (maze.arr[curpos.x][curpos.y] == '0')return 1;else return 0;}void Foot(Postype curpos){maze.arr[curpos.x][curpos.y] = '*';}void MarkPrint(Postype curpos){maze.arr[curpos.x][curpos.y] = '!';}Status StructCmp(Postype a, Postype b){if (a.x = b.x&&a.y == b.y) return 1;else return 0;}//下⼀个位置Postype NextPos(Postype CurPos, int Dir){Postype ReturnPos;switch (Dir){case 1:ReturnPos.x = CurPos.x;ReturnPos.y = CurPos.y + 1;break;case 2:ReturnPos.x = CurPos.x + 1;ReturnPos.y = CurPos.y;break;case 3:ReturnPos.x = CurPos.x;ReturnPos.y = CurPos.y - 1;break;case 4:ReturnPos.x = CurPos.x - 1;ReturnPos.y = CurPos.y;break;}return ReturnPos;}Status MazePath(Postype start, Postype end) {Stack s;SElemType e;initStack(s);Postype curpos = start;int curstep = 1;do{if (Pass(curpos)){Foot(curpos);e = { curstep, curpos, 1 };Push(s, e);if (StructCmp(curpos, end)) return 1;curpos = NextPos(curpos, 1);curstep++;}else{if (!StackEmpty(s)){Pop(s, e);while (e.dir ==4 &&!StackEmpty(s)){MarkPrint(e.seat); Pop(s, e);}if (e.dir < 4 && !StackEmpty(s)){e.dir++;Push(s, e);curpos = NextPos(e.seat, e.dir);}}}} while (!StackEmpty(s));return 0;}int main(){InitMaze();Postype s, e;s.x = s.y = 1;e.x = e.y = 8;if (MazePath(s, e))printf("迷宫成功解密!\n");elseprintf("解密失败\n");for (int i = 0; i < 10; i++){for (int j = 0; j < 10; j++){printf("%c ", maze.arr[i][j]);}printf("\n");}cout << "-=================================" << endl;for (int i = 0; i < 10; i++){for (int j = 0; j < 10; j++){if (maze.arr[i][j] == '*' || maze.arr[i][j] == '!')printf("%c ", maze.arr[i][j]);else cout << " ";}printf("\n");}}以上就是本⽂的全部内容,希望对⼤家的学习有所帮助,也希望⼤家多多⽀持。

顺序栈和迷宫求解(C语言)

顺序栈和迷宫求解(C语言)

顺序栈和迷宫求解(C语⾔)顺序栈 根据《数据结构》书中的讲解,对顺序栈的⼀个基本实现。

define.h1// define.h2 #ifndef __MENGQL_DEFINE__3#define __MENGQL_DEFINE__45#define C_LOG_DBG(format, ...)6//printf("[%s@%s,%d] " format ,__FUNCTION__, __FILE__, __LINE__, ##__VA_ARGS__);7#define C_LOG_ERR(format, ...) printf("[%s@%s,%d] " format ,__FUNCTION__, __FILE__, __LINE__, ##__VA_ARGS__);8 typedef enum EStatus {ERROR, OK} Status;910#endifSqStack.h1// SqStack.h2 #ifndef __SQ_STACK_H__3#define __SQ_STACK_H__4 #include "define.h"56 typedef struct7 {8int x;9int y;10 }PosType;1112 typedef struct13 {14int ord;15 PosType seat;16int di;17 }SElemType;1819#define STACK_INIT_SIZE 10020 typedef struct21 {22 SElemType* base;23 SElemType* top;24int stacksize;25 }SqStack;2627extern Status InitStack(SqStack *S);28extern Status GetTopStack(SqStack S, SElemType *e);29extern Status PushStack(SqStack *S, SElemType e);30extern Status PopStack(SqStack *S, SElemType *e);31extern Status StackEmpty(SqStack *S);32extern Status DestoryStack(SqStack *S);33#endifSqStack.c1// SqStack.c2 #include "define.h"3 #include "SqStack.h"4 #include <stdlib.h>5 #include <stdio.h>6 Status InitStack(SqStack *S)7 {8 S->stacksize = STACK_INIT_SIZE;9 S->base = (SElemType *)malloc(S->stacksize * sizeof(SElemType));10if(S->base == NULL)11 {12 C_LOG_ERR("%s\n","MALLOC OVERFLOW");13return ERROR;14 }15 S->top = S->base;1617return OK;18 }19 Status GetTopStack(SqStack S, SElemType *e)20 {21if(S.top == S.base)22 {23 C_LOG_ERR("%s\n","STACK IS EMPTY");24return ERROR;25 }26 *e = *(S.top-1);27return OK;28 }29 Status PushStack(SqStack *S, SElemType e)30 {31if(S->top - S->base >= S->stacksize)32 {33 S->base = (SElemType *)realloc(S->base, (S->stacksize * 2) * sizeof(SElemType)); 34if(S->base == NULL)35 {36 C_LOG_ERR("%s\n","REMALLOC OVERFLOW");37return ERROR;38 }39 S->stacksize *= 2;40 }41 *(S->top++) = e;42return OK;43 }44 Status PopStack(SqStack *S, SElemType *e)45 {46if(S->top == S->base)47 {48 C_LOG_ERR("%s\n","STACK IS EMPTY");49return ERROR;50 }51 *e = *(--S->top);52return OK;53 }54 Status StackEmpty(SqStack *S)55 {56if(S->top == S->base)57 {58return OK;59 }60return ERROR;61 }62 Status DestoryStack(SqStack *S)63 {64 S->stacksize = 0;65 free(S->base);66 S->top = S->base = NULL;67return OK;68 }迷宫求解 顺序栈实现的迷宫求解是深度优先搜索,得出的路径是⾮最短路径。

c语言实现迷宫问题

c语言实现迷宫问题

数据结构试验——迷宫问题(一)基本问题1.问题描述这是心理学中的一个经典问题。

心理学家把一只老鼠从一个无顶盖的大盒子的入口处放入,让老鼠自行找到出口出来。

迷宫中设置很多障碍阻止老鼠前行,迷宫唯一的出口处放有一块奶酪,吸引老鼠找到出口。

简而言之,迷宫问题是解决从布置了许多障碍的通道中寻找出路的问题。

本题设置的迷宫如图1所示。

入口出口图1 迷宫示意图迷宫四周设为墙;无填充处,为可通处。

设每个点有四个可通方向,分别为东、南、西、北(为了清晰,以下称“上下左右”)。

左上角为入口。

右下角为出口。

迷宫有一个入口,一个出口。

设计程序求解迷宫的一条通路。

2.数据结构设计以一个m×n的数组mg表示迷宫,每个元素表示一个方块状态,数组元素0和1分别表示迷宫中的通路和障碍。

迷宫四周为墙,对应的迷宫数组的边界元素均为1。

根据题目中的数据,设置一个数组mg如下int mg[M+2][N+2]={{1,1,1,1,1,1,1,1},{1,0,0,1,0,0,0,1},{1,1,0,0,0,1,1,1},{1,0,0,1,0,0,0,1},{1,0,0,0,0,0,0,1},{1,1,1,1,1,1,1,1}};在算法中用到的栈采用顺序存储结构,将栈定义为Struct{ int i; //当前方块的行号int j; //当前方块的列号int di; //di是下一个相邻的可走的方位号}st[MaxSize];// 定义栈int top=-1 //初始化栈3设计运算算法要寻找一条通过迷宫的路径,就必须进行试探性搜索,只要有路可走就前进一步,无路可进,换一个方向进行尝试;当所有方向均不可走时,则沿原路退回一步(称为回溯),重新选择未走过可走的路,如此继续,直至到达出口或返回入口(没有通路)。

在探索前进路径时,需要将搜索的踪迹记录下来,以便走不通时,可沿原路返回到前一个点换一个方向再进行新的探索。

后退的尝试路径与前进路径正好相反,因此可以借用一个栈来记录前进路径。

用栈求解迷宫问题所有路径及最短路径程序c语言

用栈求解迷宫问题所有路径及最短路径程序c语言

用栈求解迷宫问题所有路径及最短路径程序c语言
摘要:
1.迷宫问题的背景和意义
2.栈的基本概念和原理
3.用栈解决迷宫问题的方法
4.C 语言编程实现步骤
5.程序示例及运行结果
正文:
【1.迷宫问题的背景和意义】
迷宫问题是计算机科学中的一个经典问题,它涉及到图论、数据结构和算法等多个领域。

在迷宫问题中,给定一个有向图,目标是找到从起点到终点的所有路径以及最短路径。

这个问题在现实生活中也有很多应用,例如地图导航、物流路径规划等。

【2.栈的基本概念和原理】
栈是一种线性数据结构,它遵循后进先出(LIFO)的原则。

栈可以用来存储序列中的元素,也可以用来表示函数调用关系。

栈的操作通常包括入栈、出栈、获取栈顶元素等。

【3.用栈解决迷宫问题的方法】
为了解决迷宫问题,我们可以使用栈来记录遍历过程中的路径。

具体步骤如下:
1.创建一个栈,用于存储遍历过程中的路径;
2.从起点开始,将当前节点的编号入栈;
3.遍历当前节点的所有相邻节点,如果相邻节点未被访问过,则将其入栈;
4.当栈不为空时,继续执行步骤3;否则,说明已到达终点,开始回溯,找到最短路径;
5.从栈顶弹出节点,将其添加到结果路径列表中;
6.如果栈为空,说明没有找到从起点到终点的路径;否则,返回结果路径列表。

迷宫求解数据结构C语言版

迷宫求解数据结构C语言版

#include <stdio.h>#include <stdlib.h>#include <malloc.h>#define STACK_INIT_SIZE 100 #define STACKINCREMENT 10typedef struct{int r;int c;}PosType;//通道块坐标typedef struct {int ord;//通道块在路径上的序号PosType seat;//通道块的坐标位置int di;//下一个探索的方向}SelemType;typedef struct {int r;int c;char adr[10][10];}MazeType;//迷宫行列,内容typedef struct {SelemType * base;SelemType * top;int stacksize;}SqStack;void InitStack(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;}void Push(SqStack &S,SelemType &e){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;}void Pop(SqStack &S,SelemType &e){if(S.top==S.base) return;e=*--S.top;}void InitMaze(MazeType &maze){int i,j;maze.r=8;maze.c=8;for(i=0;i<10;i++){maze.adr[0][i]='#';maze.adr[9][i]='#';}for(i=0;i<10;i++){maze.adr[i][0]='#';maze.adr[i][9]='#';}for(i=1;i<9;i++)for(j=1;j<9;j++)maze.adr[i][j]='1';maze.adr[1][3]='#'; maze.adr[1][7]='#';maze.adr[2][3]='#'; maze.adr[2][7]='#';maze.adr[3][5]='#'; maze.adr[3][6]='#';maze.adr[4][2]='#'; maze.adr[4][3]='#';maze.adr[4][4]='#';maze.adr[5][4]='#';maze.adr[6][2]='#'; maze.adr[6][6]='#';maze.adr[7][2]='#'; maze.adr[7][3]='#'; maze.adr[7][4]='#'; maze.adr[7][6]='#';maze.adr[7][7]='#';maze.adr[8][1]='#';}int Pass(MazeType &maze,PosType &curpos){if(maze.adr[curpos.r][curpos.c]=='1')return 1;elsereturn 0;}void FootPrint(MazeType &maze,PosType curpos){maze.adr[curpos.r][curpos.c]='*';//已经走过的标记}PosType NextPos(PosType curpos,int i){PosType nextpos;nextpos=curpos;switch(i){case 1:nextpos.c+=1;break;case 2:nextpos.r+=1;break;case 3:nextpos.c-=1;break;case 4:nextpos.r-=1;break;default:printf("探寻方向错误!");}return nextpos;}void MarkPrint(MazeType &maze,PosType curpos){maze.adr[curpos.r][curpos.c]='@';//不通的标识}int StackEmpty(SqStack &S){if(S.base==S.top)return 1;elsereturn 0;}void MazePath(MazeType &maze,PosType start,PosType end) {SelemType e;SqStack S;InitStack(S);PosType curpos;int curstep;curpos=start;curstep=1;do{if(Pass(maze,curpos)){FootPrint(maze,curpos);//留下走过足迹*e.ord=curstep;e.seat=curpos;e.di=1;Push(S,e);//压入栈路径if(curpos.r==end.r&&curpos.c==end.c) return;curpos=NextPos(curpos,1);//探索下一步curstep++;}//ifelse{//当前位置不能通过if(!StackEmpty(S)){Pop(S,e);//top指针退后一下,指向上一步while(e.di==4&&!StackEmpty(S)){MarkPrint(maze,e.seat);//如果此步上下左右都探索过了且栈不为空留下不通过且返回一步Pop(S,e);}//while,用while是可以连续返回if(e.di<4){e.di++;Push(S,e);//换下一个方向探索curpos=NextPos(e.seat,e.di);//探索下一位置块}//if}//if}//else}while(!StackEmpty(S));}//mazepathvoid PrintMaze(MazeType &maze){int i,j;for(i=0;i<10;i++)printf("%4d",i);//输出行printf("\n\n");for(i=0;i<10;i++){printf("%2d",i);//输出列for(j=0;j<10;j++)printf("%4c",maze.adr[i][j]);printf("\n\n");}}void main(){MazeType maze;PosType start,end;InitMaze(maze);start.r=1; start.c=1;end.r=8; end.c=8;PrintMaze(maze);MazePath(maze,start,end);PrintMaze(maze);}。

C语言数据结构中求解迷宫问题实现方法

C语言数据结构中求解迷宫问题实现方法

C语⾔数据结构中求解迷宫问题实现⽅法C语⾔数据结构中求解迷宫问题实现⽅法在学习数据结构栈的这⼀节遇到了求迷宫这个问题,拿来分享⼀下~⾸先求迷宫问题通常⽤的是“穷举求解” 即从⼊⼝出发,顺某⼀⽅向试探,若能⾛通,则继续往前⾛,否则原路返回,换另⼀个⽅向继续试探,直⾄⾛出去。

我们可以先建⽴⼀个8*8的迷宫其中最外侧为1的是墙int mg[M+2][N+2]={{1,1,1,1,1,1,1,1,1,1},{1,0,0,1,0,0,0,1,0,1},{1,0,0,1,0,0,0,1,0,1},{1,0,0,0,0,1,1,0,0,1},{1,0,1,1,1,0,0,0,0,1},{1,0,0,0,1,0,0,0,0,1},{1,0,1,0,0,0,1,0,0,1},{1,0,1,1,1,0,1,1,0,1},{1,1,0,0,0,0,0,0,0,1},{1,1,1,1,1,1,1,1,1,1},}如上所⽰,0对应通道⽅块,1代表墙。

对于迷宫中的每个⽅块,有上下左右4个⽅块相邻,我们规定第i⾏第j列⽅块的位置为(i,j)规定上⽅⽅块⽅位为0,顺时针⽅向递增编号。

(i,j)上⽅的即为(i-1,j),下⽅(i+1,j),左⽅(i,j-1),右⽅(i,j+1). 为了⽅⾯回溯,我们需要有进栈出栈操作,所以我们来定义:struct {int i;//当前⽅位⾏int j;//当前⽅位列int di;//下⼀个可⾛⽅位号}St[MaxSize];//栈int top=-1;//初始化栈顶指针我们来看看⽂字过程~~⾸先将⼊⼝进栈(初始⽅位为-1),在栈不空的情况下循环:取栈顶⽅块(不退栈),若该⽅块是出⼝,则退栈。

若存在这样的⽅块,则将其⽅位保存到栈顶元素中,并将这个可⾛的相邻⽅块进栈。

对应的算法:void mgpath(int x1,int y1,int x2,int y2){int i.j,di,find,k;top++;St[top].i=x1; St[top].j=y1; St[top].di=-1; mg[x1][y1]=-1;while (top>-1){i=St[top].i; j=St[top].j; di=St[top].di;if (i==x2 && j==y2){printf("迷宫路径如下:\n");for (k=0;k<=top;k++){printf("\t(%d,%d)",St[k].i,S[k].j);if ((k+1)%5==0) printf("\n"); //输出5个换⼀⾏}printf("\n"); //找到⼀条路径后结束return ;}find=0;while (di<4 && find==0){di++;switch(di){case 0: i=St[top].i-1; j=S[top].j;break;case 1: i=St[top].i; j=St[top].j+1;break;case 2: i=St[top].i+1;j=St[top].j;break;case 3: i=St[top].i; j=St[top].j-1;break;}if(mg[i] [j]==0) find=1;}if (find==1){ //找到了下⼀个可⾛⽅块St[top].di=di;//修改原栈顶的值top++; //下⼀个可⾛⽅块进栈St [top].i=i; St[top].j=j;St[top].di=-1;mg[i] [j]=-1;//避免重复⾛到该⽅块}else{ //没有路径可⾛,进⾏退栈操作mg[St[top].i] [St[top].j]=0;//让该位置变为其他路径的可⾛⽅块top--;}}printf("没有路径可⾛!\n");}当然我们也可以⽤队列去求该迷宫的最优算法,这只是⼀个⽤来理解栈的例⼦~~~感谢阅读,希望能帮助到⼤家,谢谢⼤家对本站的⽀持!。

利用栈实现迷宫求解

利用栈实现迷宫求解
迷宫求解数据结构迷宫求解求解迷宫问题栈的实现利用栈求表达式的值迷宫求解课程设计c语言实现栈结构力学求解器规划求解excel规划求解
利用栈实现迷宫的求解
一、要解决的四个问题:
1、表示迷宫的数据结构:
设迷宫为 m 行 n 列,利用 maze[m][n]来表示一个迷宫,maze[i][j]=0 或 1; 其中:0 表示 通路,1 表示不通,当从某点向下试探时,中间点有 4 个方向可以试探,(见图)而四个角 点有 2 个方向,其它边缘点有 3 个方向,为使问题简单化我们用 maze[m+2][n+2]来表示迷 宫,而迷宫的四周的值全部为 1。这样做使问题简单了,每个点的试探方向全部为 4,不用 再判断当前点的试探方向有几个,同时与迷宫周围是墙壁这一实际问题相一致。
Push_SeqStack ( s, temp ) ; x=i ; y=j ; maze[x][y]= -1 ; if (x= =m&&y= =n) return 1 ; /*迷宫有路*/ else d=0 ; } else d++ ; } /*while (d<4)*/ } /*while (! Empty_SeqStack (s ) )*/ return 0 ;/*迷宫无路*/ } 栈中保存的就是一条迷宫的通路。
素有两个域组成,x:横坐标增量,y:纵坐标增量。Move 数组如图 3 所示。 move 数组定义如下: typedef struct { int x ; //行 int y ; //列 } item ; item move[4] ; 这样对 move 的设计会很方便地求出从某点 (x,y) 按某一方法思想如下:
(1) 栈初始化; (2) 将入口点坐标及到达该点的方向(设为-1)入栈 (3) while (栈不空)
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

printf(&quot;请依次输入迷宫内墙每个单元的行数,列数:(空格隔开)\n&quot;);
for(i=1;i&lt;=j;i++)
{
scanf(&quot;%d%d&quot;,&amp;x1,&amp;y1);
m[x1][y1]=0; // 定义墙的值为0
}
printf(&quot;迷宫结构如下:\n&quot;);
Print(x,y);
printf(&quot;请输入起点的行数,列数:(空格隔开)&quot;);
scanf(&quot;%d%d&quot;,&amp;begin.x,&amp;begin.y);
printf(&quot;请输入终点的行数,列数:(空格隔开)&quot;);
scanf(&quot;%d%d&quot;,&amp;end.x,&amp;end.y);
MazeType m; // 迷宫数组
int curstep=1; // 当前足迹,初值为1
#define STACK_INIT_SIZE 10 // 存储空间初始分配量
#define STACKINCREMENT 2 // 存储空间分配增量
// 栈的顺序存储表示 P46
}
}
}
}while(!StackEmpty(S));
return 0;
}
// 输出迷宫的结构
void Print(int x,int y)
{
int i,j;
for(i=0;i&lt;x;i++)
{
for(j=0;j&lt;y;j++)
printf(&quot;%3d&quot;,m[i][j]);
m[j][y-1]=0;// 迷宫右边列的周边即右边墙
}
for(i=1;i&lt;x-1;i++)
for(j=1;j&lt;y-1;j++)
m[i][j]=1; // 定义通道初值为1
printf(&quot;请输入迷宫内墙单元数:&quot;);
scanf(&quot;%d&quot;,&amp;j);
/*
数据结构C语言版 栈求解迷宫问题
P50-52 利用栈求解迷宫问题
编译环境:Dev-C++ 4.9.9.2
日期:2011年2月12日
*/
/***************头文件**********************/
0 1 0 1 0
0 2 3 4 0
0 任意键继续. . .
*/
/****************实现************************/
// 构造一个空栈S
int InitStack(SqStack *S)
{
// 为栈底分配一个指定大小的存储空间
(*S).base = (SElemType *)malloc(STACK_INIT_SIZE*sizeof(SElemType));
typedef struct SqStack
{
SElemType *base; // 在栈构造之前和销毁之后,base的值为NULL
SElemType *top; // 栈顶指针
int stacksize; // 当前已分配的存储空间,以元素为单位
}SqStack; // 顺序栈
typedef struct // 栈的元素类型
{
int ord; // 通道块在路径上的"序号"
PosType seat; // 通道块在迷宫中的"坐标位置"
int di; // 从此通道块走向下一通道块的"方向"(0~3表示东~北)
}SElemType;
// 全局变量
{
if(S.top == S.base)
return 1;
else
return 0;
}
// 插入元素e为新的栈顶元素。
int Push(SqStack *S, SElemType e)
{
if((*S).top - (*S).base &gt;= (*S).stacksize) // 栈满,追加存储空间
1 2
3 2
迷宫结构如下:
0 0 0 0 0
0 1 0 1 0
0 1 1 1 0
0 1 0 1 0
0 0 0 0 0
请输入起点的行数,列数:(空格隔开)1 1
请输入终点的行数,列数:(空格隔开)3 3
此迷宫从入口到出口的一条路径如下:
0 0 0 0 0
printf(&quot;\n&quot;);
}
}
int main()
{
PosType begin,end;
int i,j,x,y,x1,y1;
printf(&quot;请输入迷宫的行数,列数(包括外墙):(空格隔开)&quot;);
scanf(&quot;%d%d&quot;, &amp;x, &amp;y);
Pop(&amp;S,&amp;e); // 退回一步
curstep--;
}
if(e.di&lt;3) // 没到最后一个方向(北)
{
e.di++; // 换下一个方向探索
Push(&amp;S,e);
curstep++;
// 设定当前位置是该新方向上的相邻块
curpos=NextPos(e.seat,e.di);
// 迷宫坐标位置类型
typedef struct
{
int x; // 行值
int y; // 列值
}PosType;
#define MAXLENGTH 25 // 设迷宫的最大行列为25
typedef int MazeType[MAXLENGTH][MAXLENGTH]; // 迷宫数组[行][列]
}
else
printf(&quot;此迷宫没有从入口到出口的路径\n&quot;);
system(&quot;pause&quot;);
return 0;
}
/*
输出效果:
请输入迷宫的行数,列数(包括外墙):(空格隔开)5 5
请输入迷宫内墙单元数:2
请依次输入迷宫内墙每个单元的行数,列数:(空格隔开)
if( !(*S).base )
exit(0);
(*S).top = (*S).base; // 栈底与栈顶相同表示一个空栈
(*S).stacksize = STACK_INIT_SIZE;
return 1;
}
// 若栈S为空栈(栈顶与栈底相同的),则返回1,否则返回0。
int StackEmpty(SqStack S)
// 移动方向,依次为东南西北
c.x+=direc[di].x;
c.y+=direc[di].y;
return c;
}
// 使迷宫m的b点的序号变为-1(不能通过的路径)
void MarkPrint(PosType b)
{
m[b.x][b.y]=-1;
}
// 算法3.3 P51
}
else
{
// 当前位置不能通过
if(!StackEmpty(S))
{
Pop(&amp;S,&amp;e); // 退栈到前一位置
curstep--;
// 前一位置处于最后一个方向(北)
while(e.di==3&amp;&amp;!StackEmpty(S))
{
MarkPrint(e.seat); // 留下不能通过的标记(-1)
int Pass(PosType b)
{
if(m[b.x][b.y]==1)
return 1;
else
return 0;
}
// 使迷宫m的a点的序号变为足迹(curstep),表示经过
void FootPrint(PosType a)
{
m[a.x][a.y]=curstep;
{
if((*S).top == (*S).base)
return 0;
*e = *--(*S).top;
// 这个等式的++ * 优先级相同,但是它们的运算方式,是自右向左
return 1;
}
// 定义墙元素值为0,可通过路径为1,不能通过路径为-1,通过路径为足迹
// 当迷宫m的b点的序号为1(可通过路径),return 1; 否则,return 0。
// 若迷宫maze中存在从入口start到出口end的通道,则求得一条
// 存放在栈中(从栈底到栈顶),并返回1;否则返回0
int MazePath(PosType start,PosType end)
{
SqStack S;
相关文档
最新文档