利用栈求解迷宫问题

利用栈求解迷宫问题

源代码:

#include<stdio.h>

#include<stdlib.h>

#define M 8

#define N 8

#define MaxSize M*N

typedef struct

{

int i;//当前方块的行号

int j;//当前方块的列号

int di; //di是下一个可走的相邻方块的方位号

}Box;

typedef struct

{

Box data[MaxSize];

int top;      //栈顶指针

}StType;

int mg[M+2][N+2]={
//M=8,N=8

{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}};

bool mgpath(int xi,int yi,int xe,int ye)//求解路径为:(xi,yi)->(xe,ye)

{

int i,j,k,di,find;

StType st;//定义栈

st.top=-1;//初始化栈顶指针

st.top++;//初始方块进栈

st.data[st.top].i=xi;

st.data[st.top].j=yi;

st.data[st.top].di=-1;//初始方位设置为 -1

mg[xi][yi]=-1;

while(st.top>-1)//栈不空时循环

{

i=st.data[st.top].i;//取栈顶方块(不退栈)

j=st.data[st.top].j;

di=st.data[st.top].di;//取栈顶方块

if(i==xe && j==ye)//如果该方块是出口,则输出栈中所有方块即为路径

{

printf("迷宫路径如下:\n");

for(k=0;k<=st.top;k++)

{

printf("\t(%d,%d)",st.data[k].i,st.data[k].j);

if((k+1)%5==0)//每输出每5个方块后换一行

printf("\n");

}

printf("\n");

return true;//找到一条路径后返回true

}

find=0;

while(di<4 && find==0)//否则,找下一个可走相邻的方块

{

di++;

switch(di)//di为方位号

{

case 0:i=st.data[st.top].i-1;j=st.data[st.top].j;break;//(i-1,j)方位号为0

case 1:i=st.data[st.top].i;j=st.data[st.top].j+1;break;//(i,j+1)方位号为1

case 2:i=st.data[st.top].i+1;j=st.data[st.top].j;break;//(i+1,j)方位号为2

case 3:i=st.data[st.top].i;j=st.data[st.top].j-1;break;//(i,j-1)方位号为3

}

if(mg[i][j]==0)//找到下一个可走相邻方块

find=1;

}

if(find==1)//找到了下一个可走方块

{

st.data[st.top].di=di;  //修改元栈顶元素的di值

st.top++;//下一个可走方块进栈

st.data[st.top].i=i;st.data[st.top].j=j;

st.data[st.top].di=-1;

mg[i][j]=-1;//避免重复走到该方块

}

else//没有路径可走,则退栈

{

mg[st.data[st.top].i][st.data[st.top].j]=0;//让该位置变为其他路径可走方块

st.top--;    //将该方块退栈

}

}

return false;//表示没有可走路径,返回false

}

int main()

{

if(!mgpath(1,1,M,N))

printf("该迷宫问题没有解!");

system("pause");

return 0;

}

时间: 2024-11-03 01:22:18

利用栈求解迷宫问题的相关文章

利用数据结构栈求解迷宫问题

本段程序主要利用数据结构栈的先进后出特点,实现回溯求解迷宫路径问题. #include<iostream> #include<stack> using namespace std; //坐标类 struct Point { int x; int y; }; //地图类 template<int A> struct Map { int (*p)[A]; int row;//行数 int col;//列数 }; //start起始点, end终止点 template<

利用栈实现迷宫求解

利用栈实现迷宫求解 前言:众所周知,栈是(First in last out)先进后出的数据结构,利用这个属性可以实现类似与回溯的方式,比如当前数据满足条件,则入栈,否则出栈返回上一级,依次循环. 在本题中,将每个迷宫路径上的点封装成上下左右四个方向数节点,先入栈迷宫入口节点,如果上下左右没被使用,则将其上下左右的点入栈,否则出栈.如果最终达到迷宫终点则成功,否则失败. 如下是每个节点的数据结构 1 typedef struct{ 2 int top; 3 int bottom; 4 int l

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

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

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

栈是数据结构中一种重要的线性结构,限定仅在表尾进行插入和删除操作的线性表,因此我们也可以认为它是一种特殊的线性表.由于栈的这个特点,我们又可以称其为后进先出的结构.如图所示: 由于栈具有后进先出的性质我们可以利用,是程序设计中一个有用的工具.利用栈我们可以来实现数制转换.后缀表达式求值.迷宫求解等等.在书本上我们可以看到用C语言实现的简单思路,但是程序仍旧存在许多bug.今天,我想尝试用强大的C++来实现. 迷宫问题的求解思路大致则是从入口出发,顺着某一方向向前探索,若能走通,则继续向前探索:若

栈求解迷宫问题

求迷宫从入口到出口的所有路径是一个经典的程序设计问题.一般的设计思想就是从入口出发,顺着某个方向向下探索,探索分为上下左右四个方位,哪个方向是通的就将向下走,如果每个方向都走不下去就进行原路"回退".所以需要一个后进先出的结构来保存从入口到出口的路径.所以运用栈来实现是非常方便的,沿着某个方向走,将每个可通的位置进行入栈标记,再切换到下个位置:如果都不通,则栈顶出栈取消标记,再寻找.下来呢就实现一个简单的迷宫求解问题(求解出一条通路就好),至于求解多条通路并且求出最短路径的问题呢我还在

【数据结构】10分钟教你用栈求解迷宫老鼠问题超详细教程附C++源代码

问题描述 给定一张迷宫地图和一个迷宫入口,然后进入迷宫探索找到一个出口.如下图所示: 该图是一个矩形区域,有一个入口和出口.迷宫内部包含不能穿越的墙壁或者障碍物.这些障碍物沿着行和列放置,与迷宫的边界平行.迷宫的入口在左上角,出口在右下角. 问题分析 首先要有一张迷宫地图,地图由两部分组成: (1)一是迷宫中各处的位置坐标, (2)二是迷宫各位置处的状态信息,即该处是墙还是路 所以,该迷宫地图可由一个二维数组来表示.数组的横纵坐标表示迷宫各处的位置坐标,数组元素表示各位置处的状态信息. 2.在这

数据结构--书上代码用栈求解迷宫问题存在BUG(非最优解)

数据结构第四版p79页迷宫问题我觉得存在BUG,下图盗用贺老师就会的QAQ,也希望贺老师能看到帮忙解答一下啦. BUG:  程序从起始点(1,1)开始寻找路径,在当前点进行判断其上下左右是否存在可走点,如果从(1,1)点开始判断如图那么它的右(1,2)下(2,1)都是可走点那么将右边的格子坐标进栈呢还是将下边的格子坐标进栈?书本上给的代码是先判断上边格子再判断右边格子再判断下边格子再判断左边格子,这就造成了一个问题:(1,2)则个点会被进栈(因为(1,2)点位于(1,1)点的右边被先判断进栈),

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

本文适合于对迷宫问题已有初步研究,或阅读代码能力较强的人. 因此,如果你对迷宫问题一无所知,请参考其他更详细的资料. 迷宫问题,是一个对栈(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

栈实现迷宫求解(c++版)

相信大家都应该听过栈吧,一直想利用栈来实现一个算法,最近有点空,就利用栈的先进后出的特性来完成迷宫求的问题,下面将详细介绍栈的实现和迷宫求解的过程,可以很好的学习栈的使用. 栈有两种实现方法,一种是顺序,即数组形式,一种是线性,即链表形式,个人还是比较喜欢链表形式实现栈的基本功能. 首先弄一个简单的迷宫,如图: 我们很容易看出这个迷宫解的路径,那怎么让计算机帮我们求解出来呢. 首先我们要对迷宫数据化,很容易想到二维数组来表示,0表示通路,1表示障碍,即表示为: int map[4][4]={ {