//迷宫问题,暴力求解#include"stdio.h"#include"Stack.c"#define MAX_SIZE 100 //迷宫最大规格是100x100int MG[MAX_SIZE][MAX_SIZE] ;//1代表通,0代表不通typedef struct Mnode {int up ,down ,left , right ;int pass ;//是否经过}Mnode ;Status Search_Road ( Stack *s , int width , int height ,point start , point end);//寻找路径函数,找到返回TRUEint main (){Stack s ;Stack out;int w,h ;int i , j;point start ;point end ;if( Init_Stack(&s)){printf("Input migong canshu :\n") ;scanf("%d %d" ,&w , &h) ;// printf("%d %d \n",w,h);printf("input road ,0 is not able,1 is not able \n");for ( i = 0 ; i < w ; i ++){for ( j = 0 ; j < h ; j++ ){scanf("%d", &MG[i][j]) ;}}start.x = 1 , start.y =1 ,end.x = w-2,end.y = h-2 ;if (Search_Road(&s,w,h,start,end)){Init_Stack(&out) ;point  p;while (!IsEmpty(&s)){//point  p;p = Pop(&s) ;Push(&out,p) ;}p = Pop(&out) ;printf("[%d , %d]",p.x,p.y);while (!IsEmpty(&out)){// point p ;p = Pop(&out) ;printf("--> [%d , %d]",p.x,p.y);}}else{printf("No Way !\n");}}}void Clear(Mnode *m){m->down = 0;m->left = 0;m->right = 0;m->up = 0;m->pass = 0 ;}Status Search_Road ( Stack *s , int width , int height ,point start , point end){int i = 0 , j = 0 ;point p = start ;Mnode m[MAX_SIZE][MAX_SIZE] ;//保存上一个位置的探索方向Clear(&m[p.x][p.y]);for ( i ; i <height ; i++)for ( j ; j <width ; j ++ ){Clear(&m[i][j]);}do {//printf(" To point %d %d \n", p.x,p.y);if (MG[p.x][p.y] == 1&& m[p.x][p.y].pass == 0 ){//如果此位置可以通过,并且没有走过Push(s , p );//该位置进栈if ( p.x == end.x && p.y == end.y ){ //如果该点是终点,结束return TRUE ;}m[p.x][p.y].pass = 1 ;//切换当前位置的东邻方块为新的位置p.y ++ ;// Clear(&m[p.x][p.y-1]);m[p.x][p.y-1].right=1;}else{p = GetTop(s);if ( m[p.x][p.y].up !=1 ){//如果栈顶位置有其他位置没有探索,顺时针寻找栈顶位置的下一个相邻块if(m[p.x][p.y].left == 1 ){//printf("Up\n");if ( m[p.x-1][p.y].down == 1)//如果该位置的上面位置已经向下走过,则该位置不能向下走,即不能向后退{m[p.x][p.y].up = 1 ;}else{m[p.x][p.y].up = 1 ;p.x -- ;}}else if ( m[p.x][p.y].down == 1  ){// printf("left\n");if ( m[p.x][p.y-1].right == 1){m[p.x][p.y].left = 1 ;}else{m[p.x][p.y].left = 1 ;p.y -- ;}}else if ( m[p.x][p.y].right == 1  ){//  printf("Down\n");if ( m[p.x+1][p.y].up == 1 ){m[p.x][p.y].down =1 ;}else {m[p.x][p.y].down =1 ;p.x ++ ;}}}else{//如果栈不空,但栈顶四周都不通p = GetTop(s);m[p.x][p.y].pass = 0 ;Pop(s) ;p = GetTop(s);}}}while ( ! IsEmpty(s) );//如果栈空,证明没有路到终点return FALSE;}

利用栈的特性,进行求解迷宫从入口到出口的路径

下为迷宫

求解思路如下

代码如如上

其中栈的实现如下

#include"head.h"
#include<stdio.h>
#include<malloc.h>
#define elemtype point
#define INIT_STACK 100
#define INCREASEMENT_STACK 10
typedef struct point{
int x ;
   int y ;
}point;
typedef struct Stack{
elemtype *base , *top ;//栈底和栈顶指针
int size_stack ;//栈大小
}Stack ;
Status Init_Stack (Stack *s);//初始化栈
Status IsEmpty (Stack *s);//判断栈是否为空
Status Push (Stack *s, elemtype e);//进栈
elemtype GetTop (Stack *s );//得到栈顶元素
elemtype Pop(Stack *s );//出栈
Status Clear_Stack(Stack *s);//清空栈
Status Destroy_Stack (Stack *s);//销毁栈
//int main (){
//
//    Stack s ;
//    int i ;
//    Init_Stack (&s) ;
//    if (IsEmpty(&s))
//        printf("empty\n") ;
//
//    for ( i = 0; i < 110 ; i ++){
//
//        Push(&s , i) ;
//    }
//        if (!IsEmpty(&s))
//        printf("! empty\n") ;
//     printf ("%d" , Pop(&s) );
//
//     Clear_Stack(&s) ;
//     Destroy_Stack(&s) ;
//}
Status Init_Stack (Stack *s){
s->base = (elemtype *) malloc (INIT_STACK * sizeof(elemtype)); //分配空间
if (s->base == NULL) {
exit(-1) ;
 }
  s->top = s->base ;
  s->size_stack = INIT_STACK ;
}

Status IsEmpty (Stack *s){
if (s->base != NULL)
    return (s->base == s->top) ;
    else
        return ERROR ;
}
Status Push (Stack *s, elemtype e){
if (s->base == NULL)
        return ERROR ;
if ((s->top )- (s->base) >=( s->size_stack)){//如果栈满
s->base = (elemtype *)realloc (s->base , ((s->size_stack)+INCREASEMENT_STACK)*sizeof(elemtype));
                s->top = s->base + s->size_stack ;
                s->size_stack += INCREASEMENT_STACK ;
}
      *(s->top++) = e ;
     // s->top++;
      return OK;
}
elemtype GetTop (Stack *s ){
if ( !IsEmpty( s )){
return *(s->top-1) ;
    }
    printf("error : Stack Is Empty \n");
}
elemtype Pop(Stack *s ){
if (IsEmpty(s))
      {
          printf ("Stack Is Empty !") ;
      }
      return *(--s->top);
}
Status Clear_Stack(Stack *s){
s->top = s->base ;
      return OK;
}
Status Destroy_Stack (Stack *s){
free(s->base) ;
}

输入测试用例如下

栈-迷宫求解路径问题相关推荐

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

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

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

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

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

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

  4. c语言用栈输出迷宫所有路径,如何在迷宫中使用到栈

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 #include #include #include #include #define H 20 #define L 21 #define STACK_I ...

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

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

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

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

  7. 迷宫求解(深度优先)

    迷宫求解 问题初始条件: 给定一副地图,一个开始坐标,一个结束坐标,寻找一条可以从开始坐标到结束坐标的路径 问题分析: 可以用栈存储路径的坐标且坐标应有横纵两个属性来对应迷宫二维数组中的位置,此外还需 ...

  8. 迷宫求解【穷举求解法】

    迷宫求解是一个理解数据结构中栈的比较好的实践例子,下面进行分析 设迷宫是又一个2维数组组成的,元素只有0或1来表示是否通路,0代表通路,1代表有墙壁不通路 例如下图中是一条通路 穷举法:从入口出发,顺 ...

  9. 《数据结构实践》设计报告---迷宫求解

    <数据结构实践>设计报告-迷宫求解 因为学校要求答辩结课,给了很多题目都不太会,决定把感兴趣的都做一做,在这存档备用. 课程设计题目:迷宫求解 课程设计主要内容和要求: 一.设计目的: 1 ...

最新文章

  1. JVM自动内存管理:对象判定和回收算法
  2. 【Java】Java枚举类型示例
  3. uni-app 实现小程序rsa加密(非对称加密原理)
  4. 实验 5 性能测试脚本录制和开发实验报告--软件功能测试与性能测试实验
  5. 高等数学下-赵立军-北京大学出版社-题解-练习11.2
  6. 智能手机市场输家和赢家:Android手机厥后居上
  7. messagebox java_如何从messagebox获得答案
  8. 综合实例_为啥要做“三维管线综合”?看个实例就明白
  9. 若依前后端分离部署到tomcat中详细教程
  10. RSF 分布式服务框架-传输协议层设计
  11. 这简直比高考容易多了...3个月自学转行软件测试,懒散人的一次自我突破!
  12. php如何安装源码包,php源码包安装步骤是什么
  13. 分布式保存Session 和 StateServer 解决 Session过期
  14. 100%解决VMware虚拟机NAT上网方式,保姆教学
  15. Windows商店的Redis客户端G-dis3
  16. 服务器mdf ldf文件,数据库mdf和ldf文件上传到服务器
  17. matlab 计算均值,方差,标准差
  18. winxp无法访问服务器共享文件夹,winxp系统无法访问共享文件夹提示网络错误的技巧介绍...
  19. linux下exec用法,linux下exec系列(一)
  20. 阿里图标库彩色图标使用

热门文章

  1. mysql yum多实例_mysql———基于yum源实现多实例
  2. vs编译c语言停止工作运行库mt,vc++编译时运行库选择(/MT/MTd/MD/MDd)
  3. git reset后本地拉取_Git 代码防丢指南
  4. 调用支付jsapl缺少参数:totalfee openid无法取得_微信支付的软件架构,牛逼!
  5. 饶毅教授对非升即走的思考
  6. 在线WGCNA分析 (直接出交互式结果报告)
  7. 功能强大的TCGA再分析平台
  8. 12个ggplot2扩展包帮你实现更强大的可视化
  9. PS Raw增效工具 - Adobe Camera Raw14 for mac
  10. fcpx插件Title Pop:78个可自定义的Final Cut Pro X动画标题+ 2个额外背景