用栈求解迷宫问题的所有路径及最短路径程序

目的:掌握栈在求解迷宫问题中的应用。

内容:编写一个程序,输出迷宫的所有路径,并求第一条最短路径长度及最短路径。

代码如下:

#include <iostream>
#include <cstdio>
#include <stack>
#include <cstdlib>
using namespace std;
#define inf 0x3f3f3f
const int MaxSize=1000;
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 vis[6][6];
typedef struct
{
    int i;//当前方块的行号
    int j;//当前方的列号
    int di;
}Box;
typedef struct
{
    Box data[MaxSize];
    int top;//栈顶指针
}SqStack;//顺序栈类型
void InitStack(SqStack *&s)//初始化栈
{
    s=(SqStack *)malloc(sizeof(SqStack));
    s->top=-1;
}
bool Push(SqStack *&s,Box e)//进栈
{
    if(s->top==MaxSize-1)
        return false;
    s->top++;
    s->data[s->top]=e;
}
bool StackEmpty(SqStack *s)//判断栈是否为空
{
    return (s->top==-1);
}
bool Pop(SqStack *&s,Box &e)//出栈
{
    if(s->top==-1)
        return false;
    e=s->data[s->top];
    s->top--;
    return true;
}
bool GetTop(SqStack *s,Box &e)//取出栈顶元素
{
    if(s->top==-1)
        return false;
    e=s->data[s->top];
    return true;
}
bool mgpath(int xi,int yi,int xe,int ye)
{
    int minn=inf,minum;
    int cont=1;
    int f=0;
    int i,j,di,i1,j1,k;
    bool _find=false;
    SqStack *st;//定义栈st
    InitStack(st);//初始化栈st
    Box e1,e;
    e1.i=xi;
    e1.j=yi;
    e1.di=-1;
    Push(st,e1);//方块e进栈
    vis[xi][yi]=-1;//将入口的迷宫值置为-1,避免重复走到该方块
    while(!StackEmpty(st))//栈不为空时循环
    {
        GetTop(st,e);
        //cout<<e.i<<" "<<e.j<<" "<<e.di<<endl;
        i=e.i;
        j=e.j;
        di=e.di;
        if(i==xe&&j==ye)//找到了出口,输出该路径
        {
            f=1;
            if(st->top<minn)
            {
                minn=st->top;
                minum=cont;
            }
            printf("迷宫路径%d为:\n",cont++);
            for(k=0;k<=st->top;k++)
                printf("(%d,%d)\t",st->data[k].i,st->data[k].j);
            printf("\n");
        }
        _find=false;
        while(di<4&&!_find)
        {
            di++;
            switch(di)
            {
                case 0:i1=i-1;j1=j;break;
                case 1:i1=i;j1=j+1;break;
                case 2:i1=i+1;j1=j;break;
                case 3:i1=i;j1=j-1;break;
            }
            if(vis[i1][j1]==0&&mg[i1][j1]==0) _find=true;
        }
        if(_find)
        {
            st->data[st->top].di=di;
            e.i=i1;
            e.j=j1;
            e.di=-1;
            Push(st,e);
            vis[i1][j1]=-1;
        }
        else
        {
            Pop(st,e);
            vis[e.i][e.j]=0;
        }
    }
    if(f==1)
    {
        printf("最短路径为路径%d\n",minum);
        printf("最短路径长度为%d\n",minn);
        return true;
    }
    return false;
}
int main()
{
    if(!mgpath(1,1,4,4))
        printf("该迷宫问题没有解!\n");
    return 0;
}

运行结果:

用栈求解迷宫问题的所有路径及最短路径程序