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

#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#define MaxSize 100
using 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(i==xe&&j==ye)   //找到了出口,输出路径
        {
            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)%5==0)
                    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;
}

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值