栈的应用-迷宫解题

总结:这个是网上找的,下面一个是我在他基础上修改的。

/*
二. 栈的应用-迷宫解题
*/
#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>  

#define TRUE  1
#define FALSE 0
#define OK    1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW   -2  

//坐标类型
typedef struct
{
    int x;
    int y;
}Postype;           

//栈的元素类型
typedef struct
{
    int x;
    int y;
}ElemType;          

//二维数组,存储迷宫
int MAP[9][9] =
{
     0,0,0,0,0,0,0,0,0,
     0,1,0,0,1,1,1,1,0,
     0,1,0,0,1,1,1,1,0,
     0,1,1,1,1,0,1,1,0,
     0,1,0,1,0,1,1,1,0,
     0,1,0,1,0,1,1,1,0,
     0,1,0,1,0,1,1,1,0,
     0,0,0,1,1,1,1,1,0,
     0,0,0,0,0,0,0,0,0,
};  

/*-------------------------------------栈的元素类型定义完毕-------------------------*/
typedef int Status;     //函数返回值  

#define STACK_INIT_SIZE 5     // 栈的初始大小
#define STACK_INCREMENT 10      // 每次增加的空间大小  

//下面给出栈的相关定义
typedef struct
{
    ElemType *base;     //在构造栈之前和销毁之后,base的值为NULL
    ElemType *top;      //栈顶指针
    int stacksize;      //当前已分配的存储空间,以元素为单位
}ZJC_Stack;  

//--------------------------------------栈基本操作的算法部分--------------------------
//栈的初始化
Status InitStack(ZJC_Stack &S)
{  

    S.base = (ElemType *)malloc(STACK_INIT_SIZE * sizeof(ElemType));    //分配内存空间
	if(!S.base){
        exit(OVERFLOW);
	}
    else                //否则分配成功
    {
        S.top = S.base;
        S.stacksize  = STACK_INIT_SIZE;
        return  OK;
    }  

}  

//获得栈顶元素
ElemType GetTop(ZJC_Stack S)
{
    if(S.top == S.base )
        exit(ERROR);
    return *(S.top - 1);
}
//压栈
Status Push(ZJC_Stack &S,ElemType e)
{
    if(S.top - S.base >= S.stacksize)
    {
        S.base = (ElemType*)realloc(S.base,(S.stacksize + STACK_INCREMENT) * sizeof(ElemType));
        if(!S.base)
            exit(OVERFLOW);
		S.top = S.base + S.stacksize;
        S.stacksize += STACK_INCREMENT;        

    }
    *S.top++ = e;
    return OK;
}
void Print_Path(ZJC_Stack S)    //打印出栈中的元素
{
    printf("\n寻路完成..路径坐标值如下:......\n");
    ElemType *p = S.base;       //首先p指向栈底指针
    ElemType temp;
    while( p != S.top)          //只要没有到顶端,指针就移动,然后输出元素值
    {
        temp = *p;
        printf("\n路径 x = %d , y = %d",temp.x,temp.y);
        p++;
    }
}  

//出栈函数
Status Pop(ZJC_Stack &S,ElemType &e)
{
    if(S.top == S.base      )   //空栈,返回错误
		return ERROR;
    else                        //不是空栈
    {
        e = * --S.top;
        return OK;
    }
}
void PathAddToStack(int i,int j,ElemType temp,ZJC_Stack &robot)     //因为要修改值,所以取地址,开始没加取地址符号,栈顶元素一直是(1,1)
{
    temp.x = i,temp.y = j;
    Push(robot,temp);
    MAP[i][j] = 2;                      //标记已经走过该格子了,当初想是否需要用其他标记,实际上不需要的,既然标记2,那么证明当然可以走过(不是墙)!
}
void MAZH_SOLVE(int endx,int endy)      //解决迷宫问题函数,参数为终点的坐标
{
    int i = 1,j = 1;                    //起点坐标
    ZJC_Stack robot;                    //定义栈;
    if(InitStack( robot ) )             //初始化栈
        printf("\n栈的初始化完成....\n");
    ElemType CurrentPos ;               //当前位置
    ElemType start;                     //初始位置的相关信息
    ElemType temp;                      //暂时用的
    start.x = i;
    start.y = j;
    temp = start;  

    MAP[i][j] = 2;                      //走过的标记为2
    Push(robot,start);                  //初始位置入栈  

    printf("\n开始寻路....\n");
    do                                  //主要寻路算法:
    {  

          CurrentPos = GetTop(robot);
          i = CurrentPos.x;
          j = CurrentPos.y;
          printf(" \n寻路过程如下栈顶元素的 x = %d ,y = %d....\n",i,j);
          if(MAP[i][j+1] == 1)          //表明向下一格走得通
          {
              printf("\n向下能走动");    //向下前进一步,压栈,标记
              j++;
              PathAddToStack(i,j,temp,robot);
          }
          else if( MAP[i + 1][j] == 1)
          {
               printf("\n向右能走动");
                i++;
                PathAddToStack(i,j,temp,robot);
          }
          else  if(MAP[i - 1][j] == 1)
          {
               printf("\n向左能走动");
                i--;
                PathAddToStack(i,j,temp,robot);
          }
          else if(MAP[i][j - 1] == 1)
          {
               printf("\n向上能走动");
                j--;
                PathAddToStack(i,j,temp,robot);
          }
          else  //都走不动
          {
               printf("\n都走不动,退栈");
               Pop(robot,temp);
          }  

    }while( GetTop(robot).x != endx || GetTop(robot).y != endy);        //只要栈顶元素的x,y不等于终点坐标的x,y,则一直循环找路径
    printf("\n完成!\n");  

    Print_Path(robot);                  //打印出坐标值
}  

int main()    //入口函数
{
    MAZH_SOLVE(7,7);
    return 0;
}
  

/*
二. 栈的应用-迷宫解题
*/
#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>  

#define TRUE  1
#define FALSE 0
#define OK    1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW   -2  

//坐标类型
typedef struct
{
    int x;
    int y;
}Postype;           

//栈的元素类型
typedef struct
{
    int x;
    int y;
}ElemType;          

//二维数组,存储迷宫
int MAP[7][7] =
{      

     1,0,0,1,1,1,1,
     1,0,0,1,1,1,1,
     1,1,1,1,0,1,1,
     1,0,1,0,1,1,1,
     1,0,1,0,1,1,1,
     1,0,1,0,1,1,1,
     0,0,1,1,1,1,1,

};  

/*-------------------------------------栈的元素类型定义完毕-------------------------*/
typedef int Status;     //函数返回值  

#define STACK_INIT_SIZE 5     // 栈的初始大小
#define STACK_INCREMENT 10      // 每次增加的空间大小  

//下面给出栈的相关定义
typedef struct
{
    ElemType *base;     //在构造栈之前和销毁之后,base的值为NULL
    ElemType *top;      //栈顶指针
    int stacksize;      //当前已分配的存储空间,以元素为单位
}ZJC_Stack;  

//--------------------------------------栈基本操作的算法部分--------------------------
//栈的初始化
Status InitStack(ZJC_Stack &S)
{  

    S.base = (ElemType *)malloc(STACK_INIT_SIZE * sizeof(ElemType));    //分配内存空间
	if(!S.base){
        exit(OVERFLOW);
	}
    else                //否则分配成功
    {
        S.top = S.base;
        S.stacksize  = STACK_INIT_SIZE;
        return  OK;
    }  

}  

//获得栈顶元素
ElemType GetTop(ZJC_Stack S)
{
    if(S.top == S.base )
        exit(ERROR);
    return *(S.top - 1);
}
//压栈
Status Push(ZJC_Stack &S,ElemType e)
{
    if(S.top - S.base >= S.stacksize)
    {
        S.base = (ElemType*)realloc(S.base,(S.stacksize + STACK_INCREMENT) * sizeof(ElemType));
        if(!S.base)
            exit(OVERFLOW);
		S.top = S.base + S.stacksize;
        S.stacksize += STACK_INCREMENT;        

    }
    *S.top++ = e;
    return OK;
}
void Print_Path(ZJC_Stack S)    //打印出栈中的元素
{
    printf("\n寻路完成..路径坐标值如下:......\n");
    ElemType *p = S.base;       //首先p指向栈底指针
    ElemType temp;
    while( p != S.top)          //只要没有到顶端,指针就移动,然后输出元素值
    {
        temp = *p;
        printf("\n路径 x = %d , y = %d",temp.x,temp.y);
        p++;
    }
}  

//出栈函数
Status Pop(ZJC_Stack &S,ElemType &e)
{
    if(S.top == S.base      )   //空栈,返回错误
		return ERROR;
    else                        //不是空栈
    {
        e = * --S.top;
        return OK;
    }
}
void PathAddToStack(int i,int j,ElemType temp,ZJC_Stack &robot)     //因为要修改值,所以取地址,开始没加取地址符号,栈顶元素一直是(1,1)
{
    temp.x = i,temp.y = j;
    Push(robot,temp);
    MAP[i][j] = 2;                      //标记已经走过该格子了,当初想是否需要用其他标记,实际上不需要的,既然标记2,那么证明当然可以走过(不是墙)!
}
void MAZH_SOLVE(int endx,int endy)      //解决迷宫问题函数,参数为终点的坐标
{
    int i = 0,j = 0;                    //起点坐标
    ZJC_Stack robot;                    //定义栈;
    if(InitStack( robot ) )             //初始化栈
        printf("\n栈的初始化完成....\n");
    ElemType CurrentPos ;               //当前位置
    ElemType start;                     //初始位置的相关信息
    ElemType temp;                      //暂时用的
    start.x = i;
    start.y = j;
    temp = start;  

    MAP[i][j] = 2;                      //走过的标记为2
    Push(robot,start);                  //初始位置入栈  

    printf("\n开始寻路....\n");
    do                                  //主要寻路算法:
    {  

          CurrentPos = GetTop(robot);
          i = CurrentPos.x;
          j = CurrentPos.y;
          printf(" \n寻路过程如下栈顶元素的 x = %d ,y = %d....\n",i,j);  

		  if(MAP[i][j+1] && MAP[i][j+1] == 1)          //表明向下一格走得通
          {
              printf("\n向下能走动");    //向下前进一步,压栈,标记
              j++;
              PathAddToStack(i,j,temp,robot);
          }
          else if( MAP[i + 1][j] && MAP[i + 1][j] == 1)
          {
               printf("\n向右能走动");
                i++;
                PathAddToStack(i,j,temp,robot);
          }
          else  if(MAP[i - 1][j] && MAP[i - 1][j] == 1)
          {
               printf("\n向左能走动");
                i--;
                PathAddToStack(i,j,temp,robot);
          }
          else if(MAP[i][j - 1] && MAP[i][j - 1] == 1)
          {
               printf("\n向上能走动");
                j--;
                PathAddToStack(i,j,temp,robot);
          }
          else  //都走不动
          {
               printf("\n都走不动,退栈");
               Pop(robot,temp);
          }  

    }while( GetTop(robot).x != endx || GetTop(robot).y != endy);        //只要栈顶元素的x,y不等于终点坐标的x,y,则一直循环找路径
    printf("\n完成!\n");  

    Print_Path(robot);		//打印出坐标值
}  

int main()    //入口函数
{
    MAZH_SOLVE(6,6);
    return 0;
}
  

栈的应用-迷宫解题,布布扣,bubuko.com

时间: 2024-12-07 20:25:02

栈的应用-迷宫解题的相关文章

洛谷OJ P1141 01迷宫 解题报告

洛谷OJ P1141 01迷宫 解题报告 by MedalPluS [题目描述]    有一个仅由数字0与1组成的n×n格迷宫.若你位于一格0上,那么你可以移动到相邻4格中的某一格1上,同样若你位于一格1上,那么你可以移动到相邻4格中的某一格0上.你的任务是:对于给定的迷宫,询问从某一格开始能移动到多少个格子(包含自身).   [输入描述]   输入的第1行为两个正整数n,m.  下面n行,每行n个字符,字符只可能是0或者1,字符之间没有空格.  接下来m行,每行2个用空格分隔的正整数i,j,对

栈的运用---迷宫

实验2-1 栈与迷宫求解 [实验目的] 1.熟悉C语言的上机环境VC6,掌握C语言程序设计方法与特点. 2.掌握栈的顺序存储结构的定义及C语言实现. 3.掌握栈的顺序存储结构上的各种基本操作. 4.应用栈实现迷宫通路算法. 5.迷宫求解的关键结构定义及C语言实现. [问题说明] 一个迷宫可用n阶方阵表示,1表示能通过,0 表示不能通过.现假设老鼠从左上角[1,1]进入迷宫,编写算法,寻求一条从右下角[n,n] 出去的路径.下图是一个迷宫的示意图: 迷宫示意图 [算法基本思想] 迷宫求解是栈的一个

用栈实现的迷宫问题

迷宫问题中为了保证任何位置上都能沿原路退回,显然需要用一个先进后出的结果来保存从入口到当前位置的路径.因此,在迷宫通路的算法中应用“栈”也是自然而然的事情 头文件: #define STACK_INIT_SIZE 100 #define STACKINCREMENT 10 #define TRUE 1 #define FALSE 0 #define OK 1 #define ERROR 0 #define INFEASIBLE -1 #define MYOVERFLOW -2 typedef i

栈的应用——迷宫

栈和队列是数据结构中重要的部分,通过栈来实现走出迷宫. 1代表不能通行,0代表可以通行,将走的迷宫路线坐标不断地存入栈中,并赋成2,分别判断各个方向,如果是0则前进,1则判断下个方向. 迷宫的地图可以通过新建记事本,将地图输入. 代码实现: struct Pos { int _row;//行 int _col;//列 }; bool CheckIsAccess(int* a,int n,Pos next)//判断是否超出迷宫范围,是否可以前进 { if((next._row>=0)&&

【C++】使用栈Stack解决迷宫问题

我们看下面这个迷宫----方阵(也可以是矩阵): 迷宫入口是坐标(2,0)位置,出口是(9,3).我们假定0代表通路,1代表不通. 现在需要找到哪一条路是通路.我们的思想是借助栈,"回溯法".回溯是什么意思呢???先从起点出发,检查它的上下左右是否是通路(即是否有为数字0处).也就是说为0通了,压栈,将此位置元素变成2,这样做的好处是明确通路路径.然后继续往下走,判断上下左右 .直至我们找到终点(纵坐标在矩阵的最后一行). 我们来看下我针对迷宫问题实现的代码: #include<

栈与回溯:迷宫问题

迷宫问题是栈的典型应用,栈通常也与回溯算法连用. 回溯算法的基本描述是: (1)  选择一个起始点: (2)  如果已达目的地, 则跳转到 (4): 如果没有到达目的地, 则跳转到 (3) ; (3)  求出当前的可选项: a.  若有多个可选项,则通过某种策略选择一个选项,行进到下一个位置,然后跳转到 (2); b.  若行进到某一个位置发现没有选项时,就回退到上一个位置,然后回退到 (2) ; (4) 退出算法. 在回溯算法的实现中,通常要使用栈来保存行进中的位置及选项.本文给出自己写的迷宫

迷宫问题(栈)

"迷宫问题(栈)" "栈"是一种简单的数据结构,它的主要特点就是"先进后出",即就是先压入栈中的数据需要最后出栈.相当于栈是一个杯子,最先放进栈中的东西,只能够最后拿出来.下面对"栈"的特点用图形象的表示出来. 这次所要讨论的是基于栈的迷宫问题,当给定一个迷宫,我们怎样能够找出迷宫中的通道呢?如果迷宫的规模比较大,我们又该如何去实现呢?我们能够明显的知道需要使用一个二维数组用来保存迷宫,但是当迷宫的规模比较大时,或者是当我们想

迷宫问题求解(一)利用栈与递归求解出口

本文适合于对迷宫问题已有初步研究,或阅读代码能力较强的人. 因此,如果你对迷宫问题一无所知,请参考其他更详细的资料. 迷宫问题,是一个对栈(Stack)典型应用的例子之一. 假如,有如下10X10的迷宫(0代表通路,1代表障碍),我们需要用写程序来找出迷宫的出口. 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 1 1 0 1 1 0 0 0 0 1 0 0 0 1 1 1 1 0 1 1 0 1 0 0 1 1 1 0 1 0 0 1 0 1 1 1 1 0 1 1 1 1 0 0

数据结构应用:利用栈破解迷宫游戏

最近刚开始学数据结构,发现数据结构真是个神奇的东西哈,很多现实中的问题都可以用不同的数据结 构来解决,比如利用和栈中缀表达式编写一个计算机程序,利用栈破解迷宫游戏,今天我就来跟大家分 享一下如何利用栈来破解迷宫游戏. 学过数据结构的人都知道,栈的特点是:后进先出(First In Last Out);也就是说只能在栈的尾部进 行压栈和出栈,而且出栈的时候只能从最后一个数据开始.如下图: 而我们在破解迷宫游戏的时候采用的方法是"回溯",也就是在寻找通路的时候,每找到一个通路,就将这个数据