利用栈来实现“迷宫求解”

原创 2004年08月09日 10:54:00

“栈”是一个基本的数据结构,其原理是:先进后出。这个程序是我大学二年级的时候写的,当时学习数据结构老师要求的作业,不过这个确实是一个经典的程序。由于当时没有学习面向对象技术,所以采用struct来实现的。该程序在tc2,0(需要把//注释删除掉)和vc++6.0下面调试通过

#include < stdlib.h>
#include < stdio.h >
#define SIS 100
#define N 10
struct sit
{
 int seatx;
 int seaty;
};//当前访问的坐标
struct finds
{
 int ord;
 struct sit *seat;
 int di;
};//di为下个寻找的方向
struct stack
{
 struct finds *base;
 struct finds *top;
 int size;
};
void initstack(struct stack *s)
{
 struct finds *link,*end;
 s->base=s->top=link=(struct finds *)malloc(SIS*sizeof(struct finds));
 end=link+SIS-1;
 for(;link<=end;link++)
  link->seat=(struct sit *)malloc(sizeof(struct sit));
 s->size=SIS;
}//堆栈初始化
void push(struct stack *s,struct finds *find)
{
 struct finds *link,*end;
 if(s->top-s->base>=s->size)
 {
  s->base=(struct finds *)realloc(s->base,(s->size+SIS)*sizeof(struct finds));
  link=s->base+s->size;
  s->top=s->size+s->base;
  s->size+=SIS;
  end=s->base+s->size;
  for(;link<=end;link++)
   link->seat=(struct sit *)malloc(sizeof(struct sit));
  
 }
 s->top->ord=find->ord;
 s->top->seat->seatx=find->seat->seatx;
 s->top->seat->seaty=find->seat->seaty;
 s->top->di=find->di;
 s->top++;
}
void pop(struct stack *s,struct finds *find)
{
 s->top--;
 find->ord=s->top->ord;
 find->seat->seatx=s->top->seat->seatx;
 find->seat->seaty=s->top->seat->seaty;
 find->di=s->top->di;
}
void footprint(int a[N][N],struct sit *seat)
{
 int i,j;
 i=seat->seatx;
 j=seat->seaty;
 a[i][j]=-1;
}
void nextpos(struct sit *find,struct sit *seat,int di)
{
 int i,j;
     switch(di)
    {case 1:i=seat->seatx;j=seat->seaty+1;break;
           case 2:i=seat->seatx+1;j=seat->seaty;break;
     case 3:i=seat->seatx;j=seat->seaty-1;break;
                 case 4:i=seat->seatx-1;j=seat->seaty;break;
    }
   find->seatx=i;
   find->seaty=j;
}
int pass(struct sit *curpos,int a[N][N])
{
 int i,j;
 i=curpos->seatx;
 j=curpos->seaty;
 if(a[i][j]==0)return 1;
 else return 0;
}

print(struct stack *s)
{ do
 {
  printf("(%d,%d)",s->base->seat->seatx,s->base->seat->seaty);
  s->base++;
 }while(s->top!=s->base);
}
void main()
{
 struct stack *s;
 struct finds *find,*e;
 struct sit *start,*end,*curpos;
 int curstep=1,a[N][N],i,j,n,m,pa;
 char c[N][N];
  s=(struct stack *)malloc(sizeof(struct stack));
  find=(struct finds *)malloc(sizeof(struct finds));
  e=(struct finds *)malloc(sizeof(struct finds));
  start=(struct sit *)malloc(sizeof(struct sit));
  end=(struct sit *)malloc(sizeof(struct sit));
  curpos=(struct sit *)malloc(sizeof(struct sit));
  initstack(s);
  puts("在使用前请仔细阅读使用说明");
  while(1)
  {
    printf("请输入迷宫的长和宽(n,m)");
    pa=scanf("%d,%d",&n,&m);
    if(pa!=2||n>81||m>81||n<=0||m<=0)puts("输入数据错误,请重新输入");
     else break;
  }

  printf("请输入你的迷宫(0代表路径,连续输入)/n");
  for(i=0;i   scanf("%s",c[i]);
  for(i=0;i     for(j=0;j       a[i][j]=c[i][j]-48;
    while(1)
    {
     printf("进入迷宫的位置(n,m)");
     scanf("%d,%d",&curpos->seatx,&curpos->seaty);
     if(curpos->seatx>81||curpos->seaty>81||curpos->seatx<=0||curpos->seaty<=0||curpos->seatx>=n||curpos->seatx>=m||curpos->seaty>=m||curpos->seaty>=n)puts("输入数据错误,请重新输入");
     else break;

    }
          while(1)
     {
      printf("走出迷宫的位置(n,m)");
               scanf("%d,%d",&end->seatx,&end->seaty);
      if(end->seatx>81||end->seaty>81||end->seatx<=0||end->seaty<=0||end->seatx>=n||end->seatx>=m||end->seaty>=n||end->seaty>=m)puts("输入数据错误,请重新输入");
      else break;
     }

     do
  {
   if(pass(curpos,a))
     {footprint(a,curpos);
            e->ord=curstep;
         e->seat=curpos;
         e->di=1;
         push(s,e);
          if(curpos->seatx==end->seatx&&curpos->seaty==end->seaty)break;
       nextpos(curpos,e->seat,1);
         curstep++;
     } 
   else   {
      if(e->di<4){pop(s,e);e->di++,push(s,e);nextpos(curpos,e->seat,e->di);}
      else  if(e->di==4)
      {
       pop(s,e);pop(s,e);push(s,e);e->di++;
       if(e->di>4)pop(s,e);
       nextpos(curpos,e->seat,e->di);
      }
     }
   
  }while(1);
 puts("输出路径为");
 print(s);
 puts("/n");
 
}


        
  

 

利用堆栈实现迷宫问题的求解

的说法是
  • meiyubaihe
  • meiyubaihe
  • 2014年06月07日 10:47
  • 1253

栈求解迷宫问题

问题:假设下图是某迷宫的地图,问此迷宫是否有一条通路 求解思想: 用栈来实现解决问题,主要步骤是 (1)从迷宫的...
  • xyzbaihaiping
  • xyzbaihaiping
  • 2016年04月11日 23:16
  • 3315

用栈和递归求解迷宫问题

一、问题概述 小时候,我们都玩过走迷宫的游戏吧。看一下这个图例: 遇到这种问题时,我们第一反应都会先找到迷宫的入口点,然后对上下左右四个方向进行寻迹,  检测当前位置是否是通路,是否可以...
  • xxpresent
  • xxpresent
  • 2016年11月30日 21:27
  • 1922

应用栈求解迷宫问题(C++实现)

栈是数据结构中一种重要的线性结构,限定仅在表尾进行插入和删除操作的线性表,因此我们也可以认为它是一种特殊的线性表。由于栈的这个特点,我们又可以称其为后进先出的结构。如图所示:650) this.wid...
  • JulyShuofeng
  • JulyShuofeng
  • 2016年06月03日 13:15
  • 2759

C++栈实现数据结构中的迷宫求解

利用顺序栈实现数据结构中的迷宫求解问题 首先初始化一个二维数组vector>,将障碍物标记为-1,为走过的点标记为0,走过的点标记为1 从入口地址开始,依次按上下左右四个方向寻找是否有可以通行的点,如...
  • longjingwen12345
  • longjingwen12345
  • 2016年11月25日 12:47
  • 1296

以栈解决迷宫问题

怎么找到一个迷宫的出口呢。首先要知道迷宫长啥样,之后知道出入口,再之后就是找通路的过程了。     显然主要的部分是如何找通路。我们就举一个例子:     在这个迷宫中0就是墙,1就是路...
  • A_stupid_dog
  • A_stupid_dog
  • 2016年06月23日 16:23
  • 3318

运用栈求解迷宫问题C/C++

用栈解决基本的迷宫问题C/C++ 1、问题描述:设置迷宫为m*n的二维数组,起点坐标为(1,1),中点坐标为(m,n),0为通路,1为死路,为防止数组越界将四周设置边界1,即数组变为(m+2)*(n...
  • g15827636417
  • g15827636417
  • 2016年10月07日 16:18
  • 4862

数据结构(C语言版)”栈与队列“章节迷宫求解问题的思路与实现

迷宫求解问题来源自”数据结构(C语言版)“一书第50页的例题。该例题要求在不使用递归(因为暂时还没讲到),只能通过使用诸如入栈出栈的方式获取一条可以走出迷宫的路径。     在看完文字提示后,我就没有...
  • u010676110
  • u010676110
  • 2015年05月11日 18:51
  • 2203

用栈实现简单的迷宫游戏

迷宫游戏的实现是运用了栈的“后进先出”的原理,究竟如何实现的呢?下来简单的分析一下。 比如:下图是一个小迷宫 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0...
  • qq_29503203
  • qq_29503203
  • 2016年09月10日 16:07
  • 463

用栈和队列求解迷宫问题

1:①、定义一个顺序栈;     ②、编写走出迷宫代码;     ③、编写主函数。 1、栈: #include #include #include #include #define MaxSize ...
  • xdf0101
  • xdf0101
  • 2015年12月26日 20:38
  • 1656
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:利用栈来实现“迷宫求解”
举报原因:
原因补充:

(最多只允许输入30个字)