`

(转)C语言版数据结构--迷宫问题--栈的应用

阅读更多
#include <stdio.h>  
  
#include <stdlib.h>  
  
#define MAXSIZE 20  
  
#define ERROR -1  
  
#define OK   1  
  
#define FALSE 0  
  
#define TRUE  1  
  
typedef enum{RIGHT,DOWN,LEFT,UP}Direction;  
  
typedef enum{YES,NO}MarkTag;  
  
typedef struct position   //迷宫中位置的坐标  
  
{  int x;  
  
   int y;  
  
}Position;  
  
typedef struct  
  
{  int order;          //当前位置在路径中的序号  
  
  Position seat;       //当前位置在迷宫中的坐标  
  
  Direction di;       //从当前位置走到下一位置的方向  
  
}SElemType;              //栈元素的类型  
  
typedef struct  
  
{   
  
SElemType *elem;  
  
  int top;  
  
}Stack;  
  
char maze[MAXSIZE][MAXSIZE]={  
  
 {'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'}  
  
 };    //用二维字符数组表示迷宫  
  
int InitStack(Stack *S)             //创建一个空栈  
  
{  
  
S->elem=(SElemType*)malloc(MAXSIZE*MAXSIZE*sizeof(SElemType));  
  
 if(!S->elem)  return ERROR;  
  
 S->top=0;    return OK;  
  
}    
  
int Push(Stack *S,SElemType e)     //元素e入栈  
  
{   if(S->top>=MAXSIZE*MAXSIZE)   return ERROR;  
  
 S->elem[S->top++]=e;return OK;  
  
}   
  
int Pop(Stack *S,SElemType *e) //栈顶元素出栈,由e带回栈顶元素  
  
{   if(S->top<=0)     return ERROR;  
  
  *e=S->elem[--S->top];   return OK;  
  
}  
  
 int Empty(Stack S)    //判断栈是否为空  
  
{  if(S.top==0)    return TRUE;  
  
   else   return FALSE;  
  
}   
  
int createMaze(Position *startpos,Position *endpos)  
  
{ Position start,end;  
  
 printf("请输入迷宫入口的位置:");  
  
 scanf("%d%d",&start.x,&start.y);  
  
printf("请输入迷宫出口的位置:");  
  
 scanf("%d%d",&end.x,&end.y);  
  
     *startpos=start; *endpos=end;  
  
 return OK;  
  
}  //createMaze  
  
int canPass(Position curpos)  
  
{    if(maze[curpos.x][curpos.y]=='0')   return TRUE;  
  
     return FALSE;  
  
}   //canPass  
  
void markPos(Position curpos,MarkTag tag)     //为已经探索过的位置加标记  
  
{  switch(tag)  
  
 {  case YES: maze[curpos.x][curpos.y]='.'; break;   //路径标记  
  
  case NO:  maze[curpos.x][curpos.y]='#'; break;   //死胡同标记  
  
 }  
  
}    
  
//根据当前的位置坐标和下一步要探索的方向dir求下一步要走的位置坐标  
  
Position nextPos(Position curpos,Direction dir)  
  
{    Position nextpos;  
  
switch(dir)  
  
  {  case RIGHT:nextpos.x=curpos.x ;nextpos.y =curpos.y +1; break;  
  
     case DOWN :nextpos.x=curpos.x+1 ;nextpos.y =curpos.y; break;  
  
     case LEFT :nextpos.x=curpos.x ;nextpos.y =curpos.y -1; break;  
  
     case UP :nextpos.x=curpos.x-1 ;nextpos.y =curpos.y;  break;  
  
  }  
  
  return nextpos;  
  
}  
  
Direction nextDir(Direction dir)  
  
{  switch(dir)  
  
  {   case RIGHT: return DOWN;  
  
      case DOWN : return LEFT;  
  
      case LEFT: return UP;  
  
  }  
  
}  
  
int Solve(Stack *S,Position start,Position end)  
  
{//若迷宫中存在从入口start到出口end的通道,则求得一条存放在栈S中,并返回TRUE,若迷宫中不存在从入口start到出口end的通道,并返回FALSE  
  
 Position curpos;  
  
 SElemType e;  
  
 int curstep=1;   //共用的步数  
  
if(InitStack(S)==ERROR)  return FALSE;  
  
 curpos=start;  
  
do{  
  
 if(canPass(curpos)){      //当前位置可以通过  
  
     markPos(curpos,YES);   //留下足迹  
  
     e.order=curstep;e.seat=curpos;e.di=RIGHT;  
  
     Push(S,e);             //当前位置加入路径  
  
     if(curpos.x==end.x&&curpos.y==end.y)   //当前位置是出口  
  
      return TRUE;  
  
     curpos=nextPos(curpos,RIGHT);  
  
     curstep++;  
  
  }  
  
  else{              //当前位置不能通过  
  
if(!Empty(*S)){  
  
 if(Pop(S,&e)==ERROR)   return FALSE;  
  
     while(e.di==UP&&!Empty(*S)){  
  
     //四个方向都试探过,没有找到通路也不能继续探索,则回溯  
  
      curpos=e.seat;markPos(curpos,NO);  
  
      if(Pop(S,&e)==ERROR)  return FALSE;  
  
}  
  
    if(e.di!=UP){   //四个方向还没有试探完  
  
      e.di=nextDir(e.di);  
  
      Push(S,e);  //换下一个方向探索  
  
      curpos=nextPos(e.seat,e.di);  
  
  
  
}  
  
}  
  
  }  
  
 }while(!Empty(*S));  
  
 return FALSE;  
  
}  
  
void main()  
  
{  Position startPos,endPos;  
  
   Stack path;  
  
 int i,j;  
  
SElemType e;  
  
if(createMaze(&startPos,&endPos)==ERROR) return ;  
  
 Solve(&path,startPos,endPos);  
  
while(!Empty(path)){    //输出出口到入口的路径  
  
  Pop(&path,&e);  
  
  printf("(%d,%d)",e.seat.x,e.seat.y);  
  
 }  
  
//输出迷宫的图形  
  
 printf("\n");  
  
    for(i=0;i<10;i++)  
  
 {for(j=0;j<10;j++)  
  
   printf("%c ",maze[i][j]);  
  
  printf("\n");  
  
 }  
}  

 b

本文来源:http://blog.csdn.net/hqu_fritz/article/details/8075026

分享到:
评论

相关推荐

    C语言数据结构顺序栈之迷宫求解

    本主题聚焦于“C语言数据结构顺序栈之迷宫求解”,这是一个结合了基本数据结构和算法的有趣应用。我们将深入探讨顺序栈、迷宫问题以及如何使用C语言实现迷宫求解算法。 顺序栈是一种线性数据结构,它的元素按照...

    C语言数据结构用队列求解迷宫最短路径

    从给定的代码片段来看,这是一段使用C语言实现迷宫最短路径求解的程序,主要通过队列(Queue)与栈(Stack)的数据结构来完成算法的设计与实现。下面将对这段代码涉及的关键知识点进行详细解析。 ### C语言中的数据...

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

    栈的应用-迷宫问题-数据结构(C语言版)-源代码(直接运行)[定义] 本文档主要讨论了栈的应用在迷宫问题中的解决方案,使用C语言编写的源代码来实现迷宫路径的搜索。整个程序的结构分为三部分:栈的实现、迷宫问题的...

    数据结构栈和队列解决迷宫问题

    数据结构栈和队列解决迷宫问题 本文档详细介绍了利用栈和队列解决迷宫问题的步骤,对于初学者学习数据结构能很好的进行辅导。本文档主要涉及到数据结构的两个重要概念:栈和队列,并介绍了如何使用这两个数据结构来...

    数据结构(C语言版) 栈与队列 迷宫问题

    在C语言版的数据结构课程中,第三章深入探讨了两种基础但非常重要的数据结构——栈和队列,并应用它们解决实际问题,如迷宫问题。 栈是一种后进先出(LIFO)的数据结构,类似于我们日常生活中的叠放物品。它主要...

    数据结构 c语言版迷宫程序

    "数据结构 c语言版迷宫程序"是一个典型的数据结构应用实例,它利用C语言来解决迷宫问题,涉及到路径搜索、图遍历等算法。 在迷宫问题中,我们可以将迷宫视为一个二维矩阵,每个位置可以是墙壁(障碍)或通路。通常...

    C语言数据结构顺序栈之迷宫求解最短路径

    总结来说,C语言数据结构中的顺序栈在迷宫求解最短路径问题中发挥着核心作用。通过对顺序栈的理解和熟练运用,我们可以设计高效的算法解决实际问题。对于学习者而言,深入理解和实践这部分内容将对提升编程技能和...

    C语言数据结构 迷宫算法

    在IT领域,尤其是在编程和算法设计中,"C语言数据结构 迷宫算法"是一个具有挑战性和趣味性的主题。这个主题涉及到C语言编程、数据结构和算法应用,特别是动态堆栈的使用。以下是对这些知识点的详细解释: 1. **...

    迷宫迷宫数据结构c语言

    根据给定的信息,本文将详细解释迷宫问题的数据结构实现及其C语言代码解析。迷宫问题通常涉及到寻路算法的应用,而本示例通过栈结构实现了从起点到终点的最短路径查找。 ### 标题解析:迷宫数据结构 C语言 此标题...

    C语言数据结构迷宫.rar

    《C语言数据结构迷宫》这个压缩包文件包含两部分内容:一份名为“迷宫_xiaohui.txt”的文本文件和一个“www.pudn.com.txt”的文档。从标题和描述中我们可以推测,这个资源可能与使用C语言进行数据结构的学习有关,...

    (完整word版)数据结构栈求解迷宫问题C语言版.doc

    数据结构栈求解迷宫问题C语言版 在计算机科学中,迷宫问题是一个经典的算法问题,旨在寻找从迷宫的起点到终点的路径。为了解决这个问题,我们可以使用栈数据结构来存储路径,并使用递归或迭代的方法来寻找路径。在...

    迷宫求解算法数据结构c语言

    从给定的代码片段和描述来看,这是一段用C语言实现的迷宫求解算法,涉及到了数据结构中的栈的应用。接下来,我们将详细解析这段代码所体现的关键知识点。 ### 迷宫求解算法 迷宫求解算法通常采用深度优先搜索(DFS...

    C语言版数据结构与算法分析-严蔚敏经典视频教程

    03-002栈的应用、数制转换、括号匹配、行编辑问题、迷宫问题 03-003栈的应用:表达式求值、后缀表达式的表示 03-004队列的定义与存储、顺序队列、链式队列、循环队列 04-001串的定义、表示与实现 04-002串的模式...

    数据结构之迷宫求解完整代码(C语言版)

    迷宫求解问题是一个典型的数据结构应用,它涉及到路径搜索算法,如深度优先搜索(DFS)或广度优先搜索(BFS)。在这个C语言实现的案例中,我们将深入探讨这两个算法以及如何将它们应用于迷宫问题。 首先,我们要...

    C语言数据结构递归算法之迷宫求解

    综上所述,"C语言数据结构递归算法之迷宫求解"是一个典型的算法问题,它综合运用了C语言编程、数据结构(二维数组)以及递归算法(深度优先搜索)。通过理解和实践此类问题,可以提升对计算机科学核心概念的理解和...

    用栈解决迷宫问题C语言描述

    本主题将探讨如何利用栈这一数据结构,用C语言解决迷宫问题。栈是一种后进先出(LIFO)的数据结构,适用于解决回溯问题,如迷宫中的路径寻找。 首先,我们要理解迷宫问题的基本设定:一个二维矩阵代表迷宫,其中1...

    C语言-迷宫程序 数据结构案例

    这个“C语言-迷宫程序 数据结构案例”是一个很好的学习资源,它结合了C语言的基础知识和数据结构的应用。让我们深入探讨一下其中涉及的知识点。 首先,迷宫问题通常涉及到路径寻找算法,这可能包括深度优先搜索...

    数据结构,迷宫问题C语言版源代码

    数据结构中,关于迷宫问题的源代码(C语言)。课程作业是解决迷宫求解的问题,从入口出发,顺某一方向向前探索,若能走通,则继续往前走;否则沿原路退回,换一个方向再继续探索,直至所有可能的通路都探索到为止。...

    数据结构课程设计---迷宫的源代码

    迷宫问题与数据结构应用 在计算机科学中,迷宫问题常被用来作为数据结构和算法教学的经典案例。通过解决迷宫问题,学生可以深入理解并实践栈、队列、图、深度优先搜索(DFS)、广度优先搜索(BFS)等数据结构和算法...

Global site tag (gtag.js) - Google Analytics