数据结构 迷宫问题,数据结构迷宫求解课程设计

  数据结构 迷宫问题,数据结构迷宫求解课程设计

  假设在一个四行四列的二维数组中,1为墙,0为通道,我们要怎样找到出口

  0行0列为入口,右下角为出口,最后还要打印他的坐标,那我们应该怎么做?

  分析:可以采用深度优先算法

  1、判断当前位置的上下左右是否有为0的数,为0就走,为一就不走

  2、有个前提就是要判断这个坐标是否有效

  3、当走错了,是不是要回到上下左右任意位置有为0的地方,但是假设上下左右都有为0的通路,那我们怎么知道那个路是我们走过的哪个是没走过的,使用就要进行标记,怎么标记,可以随便给他重新赋值

  4、打印坐标,假设已经找到出口了,那我们打印坐标是不是要反着打印,那是不是就可以采用栈,栈的特性就是后进先出,先把坐标入栈,当遇到死胡同返回到某一位置时是不是就依次把错误的坐标出栈,最后再创建一个栈,把老栈里的坐标倒到新栈,是不是就可以把坐标从后往前打印

  好了具体的分析完毕,再补充一个知识点

  代码有点小长,上代码

  #define _CRT_SECURE_NO_WARNINGS

  #包含标准视频

  #包含标准库

  #include assert.h

  #包含标准布尔

  数据类型说明结构路径

  {

  (同Internationalorganizations)国际组织行;

  内部列

  }拍拍;

  /*///////////////////////////////////////////////////////////////////////////////////////////////////////////////////*/

  typedef PAT标准数据类型

  数据类型说明结构堆栈

  {

  stdata类型* a;

  int top//指向栈顶就是大小

  (同Internationalorganizations)国际组织容量;//容量

  } ST

  void堆栈初始化(ST * PS);//初始化

  无效堆叠打印(const ST * PS);//打印

  void StackPush(ST* ps,stdata type x);//入栈

  无效堆栈销毁(ST * PS);//销毁

  空的堆栈弹出(ST * PS);//出栈

  stdata类型栈顶(const ST * PS);//取栈顶

  int堆栈大小(const ST * PS);//计算栈的元素

  //bool StackEmpty(const ST* ps,int * size);

  bool StackEmpty(const ST * PS);//判断栈是否为空

  无效堆栈单位(ST* ps)

  {

  assert(PS);

  PS-a=NULL;

  ps-容量=0;

  PS-top=0;//也可以给-1

  }

  //void StackPrint(const ST* ps)

  //{

  //assert(PS);

  //int I;

  //for(I=PS-top-1;我我-)

  //{

  //printf(%d ,PS-a[I]);

  //}

  //printf( \ n );

  //}

  无效新堆栈(ST* ps)

  {

  int newcapacity=ps- capacity==0?4 : ps-容量* 2;

  ST* newStack=realloc(ps- a,sizeof(ST)*新容量);

  if (newStack==NULL)

  {

  printf(开辟内存失败);

  退出(-1);

  }

  PS-a=新堆栈;

  PS-容量=新容量;

  }

  void StackPush(ST* ps,STDataType x)

  {

  assert(PS);

  如果(ps容量==ps顶部)

  {

  新栈(PS);

  }

  PS-a[PS-top]=x;

  PS-top;

  }

  无效堆栈弹出(ST* ps)

  {

  assert(PS);

  断言(ps- top

  如果(ps- top 0)

  PS-top-;

  }

  STDataType StackTop(const ST* ps)

  {

  assert(PS);

  断言(ps- top

  返回PS-a[PS-top-1];

  }

  int StackSize(const ST* ps)

  {

  assert(PS);

  返回ps-

  }

  布尔堆栈

  {

  return PS-top==0;

  }

  无效堆栈销毁(ST* ps)

  {

  assert(PS);

  free(PS-PS-a=NULL;

  PS-capacity=PS-top=0;

  }

  斯托克斯路径;//设置全局栈

  /*///////////////////////////////////////////////////////////////////////////////////////////////////////////////////*/

  //输出路径坐标

  无效打印路径(ST*路径)

  {

  圣rPath

  堆栈初始化(rPath);

  而(!堆栈式(路径))

  {

  StackPush( rPath,stack top(path));

  堆栈弹出(路径);

  }

  而(!StackEmpty( rPath))

  {

  PAT top=栈顶(rPath);

  printf(( %d,%d)),top.row,top。col);

  堆栈弹出(rPath);

  }

  堆栈销毁(rPath);

  }

  void Print(int** maze,int n,int m)

  {

  for(int I=0;我我)

  {

  for(int j=0;j j)

  {

  printf( %d ,maze[I][j]);//输入二维数组的值

  }

  printf( \ n );

  }

  printf( \ n );

  }

  bool IsPass(int** maze,int n,int m,PAT cur)

  {

  如果(当前行=0当前行n

  当前列=0当前列m

  迷宫[当前行][当前列]==0)

  {

  返回真实的

  }

  其他

  返回错误的

  }

  bool GetMazePath(int** maze,int n,int m,PAT cur)

  {

  StackPush( path,cur);//先入栈

  如果(当前行==n - 1当前列==m - 1)

  {

  迷宫[当前行][当前列]=2;//把出口也赋值为2

  返回真实的

  }

  迷宫[当前行][当前列]=2;

  //上

  拍拍下;

  下一个=当前

  下一个。row-=1;

  if (IsPass(maze,n,m,next))

  {

  if (GetMazePath(maze,n,m,next))//找到出路了

  返回真实的

  }

  //下

  下一个=当前

  下一个。row=1;

  if (IsPass(maze,n,m,next))

  {

  if (GetMazePath(maze,n,m,next))//找到出路了

  返回真实的

  }

  //左

  下一个=当前

  下一个。col-=1;

  if (IsPass(maze,n,m,next))

  {

  if (GetMazePath(maze,n,m,next))//找到出路了

  返回真实的

  }

  //右

  下一个=当前

  下一个。col=1;

  if (IsPass(maze,n,m,next))

  {

  if (GetMazePath(maze,n,m,next))//找到出路了

  返回真实的

  }

  堆栈弹出(路径);//如果以上条件都不满足就出栈

  返回错误的

  }

  int main()

  {

  int n=0,m=0;

  scanf(%d,%d ,n,

  //创建二维数组的行

  int * * maze=(int * *)malloc(sizeof(int *)* n);

  for(int I=0;我我)

  {

  //创建二维数组的列

  maze[I]=(int *)malloc(sizeof(int)* m);

  }

  for(int I=0;我我)

  {

  for(int j=0;j j)

  {

  scanf(%d ,maze[I][j]);//输入二维数组的值

  }

  }

  StackInit(路径);

  PAT在path={ 0.0 }中;

  if (GetMazePath(maze,n,m,InPath))

  打印路径(路径);

  其他

  printf( false );

  printf( \ n );

  打印(迷宫,n,m);

  堆栈销毁(路径);

  for(int I=0;我我)

  {

  免费(迷宫【我】);

  }

  自由(迷宫);

  迷宫=空;

  }

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

相关文章阅读

  • mysql复合索引和组合索引,mysql组合索引数据结构
  • mysql复合索引和组合索引,mysql组合索引数据结构,Mysql之组合索引方法详解
  • mysql复合索引和组合索引,mysql复合索引数据结构
  • mysql复合索引和组合索引,mysql复合索引数据结构,MySQL的复合索引总结
  • b+树 多路搜索树,数据结构中树的分类
  • b+树 多路搜索树,数据结构中树的分类,数据结构-树(三):多路搜索树B树、B+树
  • avl树的构造,avl树特性,数据结构之AVL树详解
  • 数据结构c语言哈夫曼树,c语言哈夫曼树的构造,使用C语言详解霍夫曼树数据结构
  • c语言数据结构算法编程库,数据结构 c语言中文网
  • c语言数据结构算法编程库,数据结构 c语言中文网,C语言编程数据结构基础详解小白篇
  • c++纸牌游戏,数据结构纸牌游戏c语言
  • c++纸牌游戏,数据结构纸牌游戏c语言,C语言实战之纸牌游戏
  • ,,c#解析jobject的数据结构
  • ,,javascript数据结构之多叉树经典操作示例【创建、添加、遍历、移除等】
  • ,,Java 数据结构与算法系列精讲之背包问题
  • 留言与评论(共有 条评论)
       
    验证码: