数据结构-顺序栈解决迷宫问题

本文详细解析了一种基于栈的迷宫路径寻找算法,通过递归回溯的方式找到从起点到终点的所有可能路径,并确定了最短和最长路径。算法使用C语言实现,展示了如何在二维数组中模拟迷宫并进行路径探索。

#include <stdio.h>
#include <stdlib.h>
#include
#define MaxSize 100using namespace std;
int M=4,N=4;
int mg[6][6]={ {1,1,1,1,1,1}, {1,0,0,0,1,1}, {1,0,1,0,0,1}, {1,0,0,0,1,1}, {1,1,0,0,0,1}, {1,1,1,1,1,1}};
int minlen=MaxSize,maxlen=0;typedef struct{
int i; //路径横坐标
int j; //路径纵坐标
int di; //方向}
Box;typedef struct{
Box data[MaxSize];
int top;} SyType; //定义栈来存储数组void mgpath(int xi,int yi,int xe,int ye){
int i,j,k,di,find,count=1;
SyType
st,path,path1;
st.top=-1;
st.top++;
st.data[st.top].i=xi; //初始点进栈
st.data[st.top].j=yi;
st.data[st.top].di=-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(ixe&&jye) //找到了出口,输出路径 { printf(“M:%d”,count++);
for(k=0; k<=st.top; k++) { printf("\t(%d,%d)",
st.data[k].i,st.data[k].j);
if((k+1)%50)
printf("\n"); }
printf("\n");
if(st.top+1<minlen) //比较输出最短路径 { for(k=0; k<=st.top; k++)
path.data[k]=st.data[k];
minlen=st.top+1; }
if(st.top+1>maxlen) //比较输出最长路径 { for(k=0; k<=st.top; k++)
path1.data[k]=st.data[k]; maxlen=st.top+1; }
mg[st.data[st.top].i][st.data[st.top].j]=0; //将该位置变为你其他路径可走的位置
st.top–;
i=st.data[st.top].i; j=st.data[st.top].j; di=st.data[st.top].di; }
find=0;
while(di<4&&find
0)
//找下一个可走点 { di++; switch(di) { case 0:

                                                   i=st.data[st.top].i-1;                j=st.data[st.top].j;                break;            case 1:                i=st.data[st.top].i;                j=st.data[st.top].j+1;                break;            case 2:                i=st.data[st.top].i+1;                j=st.data[st.top].j;                break;            case 3:                i=st.data[st.top].i;                j=st.data[st.top].j-1;                break;            }            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--;        }    }    printf("最短长度:  %d\n",minlen);    printf("最短路径如下: ");    for(k=0; k<minlen; k++)    {        printf("(%d,%d)  ",path.data[k].i,path.data[k].j);        if((k+1)%5==0)            printf("\n");    }    printf("\n");    printf("最长长度:  %d\n",maxlen);    printf("最短路径如下: ");    for(k=0; k<maxlen; k++)    {        printf("(%d,%d)  ",path1.data[k].i,path1.data[k].j);        if((k+1)%5==0)            printf("\n");    }}int main(){    printf("迷宫路径如下:\n");    mgpath(1,1,M,N);    return 0;}

作者:追风筝的咸鱼
来源:优快云
原文:https://blog.youkuaiyun.com/zw159357/article/details/72835005

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值