#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define OVERFLOW -2
#define FALSE 0
#define TRUE 1
#define OK 1
#define ERROR 0
//栈的顺序存储表示#define STACK_INIT_SIZE 100 //存储空间的初始分配量
#define STACKINCREAMENT 10  //存储空间分配增量//坐标数据类型
typedef struct
{int x;int y;
}PosType;typedef struct
{int ord;       //通道块在路径上的序号,自己走过的时候设定PosType seat;   //通道块在迷宫中的坐标位置int di;          //从通道块走向下一个通道块的方向,规定0上,1下,2左,3右
}SElemType;         //栈的元素类型typedef struct
{SElemType *base;  //构造之前和销毁之后base的值为NULLSElemType *top;   //栈顶指针int stacksize;    //当前已分配的存储空间
}SqStack;typedef int MazeType;
typedef int Status;SqStack S;
Status 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;
}
Status GetTop(SqStack S,SElemType *e)
{if(S.top==S.base) return ERROR;*e=*(S.top-1);return OK;
}
Status Push(SqStack *S,SElemType e)
{if(S->top-S->base>=S->stacksize)//栈满,追加存储空间{S->base=(SElemType *)realloc(S->base,(S->stacksize+STACKINCREAMENT)*sizeof(SElemType));if(!S->base) exit(OVERFLOW);S->top=S->base+S->stacksize;S->stacksize+=STACKINCREAMENT;}//入栈操作,完成操作后,top指针加1*S->top++=e;return OK;
}
Status Pop(SqStack *S,SElemType *e)
{if(S->base==S->top) return ERROR;*e=*--S->top;return OK;
}
Status StackEmpty(SqStack S)
{if(S.base==S.top){return TRUE;}else{return FALSE;}
}
Status Pass(PosType curpos,MazeType maze[6][6])
{if(maze[curpos.x][curpos.y]==1){return TRUE;}else{return FALSE;}
}
void FootPrint(PosType curpos)
{printf("current positon (%d,%d)\n",curpos.x,curpos.y);
}
MarkPrint(PosType pos)
{}
PosType NextPos(PosType curpos,int n)
{switch(n){case 0:curpos.x--; break; case 1:curpos.x++; break;case 2:curpos.y--; break;case 3:curpos.y++; break;}return curpos;
}
//栈的应用 迷宫求解问题,这段代码是书上的
Status MazePath(MazeType maze[6][6],PosType start,PosType end)
{//若迷宫maze中存在入口start到出口end的通道则求得一条存放在栈中,并返回TRUE,否则返回FALSEPosType curpos;      //当前位置SElemType e;      //e用于接收通道块信息int curstep;InitStack(&S);curpos=start;      //设定当前位置为入口位置curstep=1;          //探索第一步do{if(Pass(curpos,maze)){FootPrint(curpos);      //留下足迹e.ord=1;e.di=0;e.seat=curpos;Push(&S,e);if(curpos.x==end.x && curpos.y==end.y) return (TRUE);//到达终点出口curpos=NextPos(curpos,0);curstep++;}else     //当前位置不能通过{if(!StackEmpty(S)){Pop(&S,&e);while(e.di==3 && !StackEmpty(S)){MarkPrint(e.seat); Pop(&S,&e);    //留下不能通过的标记,并退回一步}if(e.di<3){e.di++;Push(&S,e);    //换下一个方案curpos=NextPos(e.seat,e.di); //设置当前位置是该新方向的相邻块}//if}//if}//else}while(!StackEmpty(S));printf("can't find a path to get to the end\n");return (FALSE);
}
void FindPath(MazeType maze[6][6],PosType start,PosType end)
{PosType curpos;int ord=1;int di=0;SElemType e;curpos=start;InitStack(&S);FootPrint(curpos);e.di=0;e.seat=curpos;e.ord=1;Push(&S,e);curpos=NextPos(curpos,e.di);while(1){if(Pass(curpos,maze)){FootPrint(curpos);e.ord=ord;e.seat=curpos;Push(&S,e);curpos=NextPos(curpos,e.di);if(curpos.x==end.x && curpos.y==end.y){printf("you have get to the end (%d,%d)\n",end.x,end.y);return (TRUE);}ord++;}else{Pop(&S,&e);   //这里有一个问题,就是在一个点它的连续两个方向都找不到,那么就要Pop两次//这里先提前做一个判断,如果不能通过则继续改变方向,避免重新进来Pop了两次,不在是之前的点了while(1)     //一直用死循环会不会不太好{e.di++;if(e.di>3) e.di=0;curpos=NextPos(e.seat,e.di); //退回上一步,换一个方向重试if(Pass(curpos,maze)) break;}ord++;}}
}
//产生迷宫图的函数,先设置边框,再设置障碍,比直接输入方便一点
void GenMaze(MazeType a[6][6])
{int i,j;for(i=0;i<6;i++){for(j=0;j<6;j++){a[i][j]=1;a[0][j]=0;a[5][j]=0;}a[i][0]=0;a[i][5]=0;}
}
void printMaze(MazeType a[6][6])
{int i,j;for(i=0;i<6;i++){for(j=0;j<6;j++){printf("%3d",a[i][j]);}printf("\n");}
}
int main()
{MazeType a[6][6];PosType start={1,1};PosType end={3,3};GenMaze(a);printMaze(a);printf("\nstart position (%d,%d),end position (%d,%d)\n",start.x,start.y,end.x,end.y);FindPath(a,start,end);return 0;
}

顺序栈实现迷宫求解问题v0.1相关推荐

  1. java使用链栈实现迷宫求解

    java实现链栈在前面有所介绍:http://www.cnblogs.com/lixiaolun/p/4644141.html java实现链栈的代码: package stackapplicatio ...

  2. C语言用栈实现迷宫求解

    大学的实训课,要求做一个迷宫,其中墙用1标注,通路用0标注,然后寻找一个从默认起点1,1到默认终点8,8的通路.发现网上有好多类似的其实都用不了,于是乎自己缝缝补补出了一个能用的,注解写的比较全,可以 ...

  3. 栈和队列求解迷宫问题(数据结构学习笔记)

    文章目录 迷宫问题 "栈"求解迷宫问题 行走规则 算法思路 算法代码 栈的定义 算法设计 完整代码 最终迷宫路径 算法总结 "队列"求解迷宫问题 算法思路 算法 ...

  4. 数据结构之迷宫问题求解(一)利用栈与递归求解出口

    本文适合于对迷宫问题已有初步研究,或阅读代码能力较强的人. 因此,如果你对迷宫问题一无所知,请参考其他更详细的资料. 迷宫问题,是一个对栈(Stack)典型应用的例子之一. 假如,有如下10X10的迷 ...

  5. c++:栈的基本操作+实例:迷宫求解

    栈的基本操作+实例:迷宫求解 #include<iostream> using namespace std;struct Node {int datai;int dataj;Node* n ...

  6. C语言 迷宫问题求解(顺序栈应用示例)

    [cpp] view plaincopy //顺序栈的应用:迷宫 //作者:nuaazdh //时间:2011年12月7日 #include <stdio.h> #include < ...

  7. 栈-迷宫求解路径问题

    //迷宫问题,暴力求解#include"stdio.h"#include"Stack.c"#define MAX_SIZE 100 //迷宫最大规格是100x1 ...

  8. 栈的应用--迷宫求解

    栈的应用–迷宫求解 思路: 从一个起点(1,1)坐标开始, 依次判断它的右,下,左,上, 方位能不能走 如果能就直接走, 每走一步将这个位置的坐标入栈, 并且标记为2, 若都不能走, 说明走到死路了, ...

  9. java迷宫算法栈_java - 用Java创建迷宫求解算法 - 堆栈内存溢出

    我被分配了在Java中创建迷宫求解器的任务. 这是作业: Write an application that finds a path through a maze. The maze should ...

  10. c语言迷宫问题输出坐标,C语言数据结构之迷宫求解问题

    现在网上各种对于迷宫的求解,版本多的数不胜数.本人小白一枚,贴上自己对迷宫的求解这个小项目,自己写的.望能帮助一些同样有困难的人,毕竟我当时费解了好一会儿时间呢. 首先,先标明对于迷宫求解这个项目,首 ...

最新文章

  1. python安装成功第三方库但import出问题_解析pip安装第三方库但PyCharm中却无法识别的问题及PyCharm安装第三方库的方法教程...
  2. 实用技巧:使用 Google Analytics 跟踪 JS 错误
  3. First Steps with TensorFlow代码解析
  4. C语言 strlen函数实现
  5. jps命令 Java Virtual Machine Process Status Tool
  6. vim 的复制粘贴剪切
  7. 华为NP课程笔记8-BGP2
  8. cityscape 数据集 mmsegmentation训练记录
  9. Html论坛提问页面,技术分享 - 制作论坛发帖页面(采用html()方式、操作节点的方式)...
  10. 什么是动态域名解析?---金万维
  11. python怎么解压rar文件
  12. java 实心圆,如何用css3实现实心圆
  13. 职业教育计算机教学,浅析职业教育中的计算机教学思考.doc
  14. 在Oracle官网下载并安装JDK然后配置环境变量
  15. idea如何全局搜索关键字_intellij idea 怎么全局搜索
  16. 南京柳树湾与云南汉族人
  17. 疫情已经2年半,中国IT厂商该有一些经验教训和改变了
  18. Apache Hadoop KMS 部署
  19. 相似度系列-3:传统方法ROUGE ROUGE: A Package for Automatic Evaluation of Summaries
  20. 大规模机器学习在爱奇艺视频分析理解中的实践

热门文章

  1. RFC792翻译(ICMP主要内容)
  2. 记忆网络之在对话系统中的应用
  3. 【版本控制工具】svn服务器、客户端安装配置及eclipse的svn检出
  4. oh my Zsh使用手册
  5. cocos2d-x—schedule介绍
  6. 最近遇到个关于接口的奇怪的问题
  7. 威盾VIACONTROL远程监控注册机及试用手记
  8. Spark—local模式环境搭建
  9. MongoDB高可用集群搭建(主从、分片、路由、安全验证)
  10. [Linux]不可重入函数