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

迷宫问题求解

任务:可以输入一个任意大小的迷宫数据,用非递归的方法求出一条走出迷宫的路径,并将路径输出;

要求:在上交资料中请写明:存储结构、基本算法(可以使用程序流程图)、源程序、测试数据和结果、算法的时间复杂度、另外可以提出算法的改进方法;

 #include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <algorithm>
#include <math.h>
using namespace std;
#define MAX 500 //栈的最大值

struct Point
{
    int x,y;
    int vector[4],sum;///0 1 2 3 表示上下左右
    char c;
    int visit[4];
    Point operator=(Point &a)
    {
        x=a.x;y=a.y;sum=a.sum;c=a.c;
        for(int i=0;i<4;i++)
        {
            visit[i]=a.visit[i];
            vector[i]=a.vector[i];
        }
    }
}point[500][500];
typedef struct
{  Point base[MAX];
    int top;
}SqStack;
SqStack SqStackInit()//初始化栈
{
    SqStack S;
    S.top=-1;
    return S;
}
bool StackEmpty(SqStack S)//判断栈空
{
    if(S.top==-1)
        return true;
    else
        return false;
}
void SqStackPush(SqStack &S,Point x)//入栈
{
    if(S.top==MAX-1)
    {
        cout<<"栈满了";
        return ;
    }
    S.top++;
    S.base[S.top]=x;

}
void SqStackPop(SqStack &S)//出栈
{
    if(S.top==-1)
    {
        cout<<"栈满了";
        return ;
    }
    S.top--;
}
Point GetSqStackTop(SqStack S)//取栈顶元素
{
    return (S.base[S.top]);
}

char answer[500][500];
SqStack S=SqStackInit();
void input(int n,int m)
{
    cout<<"请输入迷宫矩阵,‘.’代表路径,‘x’代表墙壁\n";
    for(int i=1;i<=n;i++)
            for(int j=1;j<=m;j++)
            {cin>>point[i][j].c;point[i][j].x=i;point[i][j].y=j;}
}
void init(int n,int m)
{
    int a[4]={1,-1,0,0};
    int b[4]={0,0,-1,1};
    for(int i=1;i<=n;i++)
        for(int j=1;j<=m;j++)
        {   point[i][j].sum=0;
                for(int k=0;k<4;k++)
                    if(point[i][j].c=='.'&&point[i+a[k]][j+b[k]].c=='.')
                            {point[i][j].vector[k]=1;point[i][j].sum++;point[i][j].visit[k]=0;}
                    else {point[i][j].vector[k]=0;point[i][j].visit[k]=1;}
        }
}
void show(int n,int m)
{
    for(int i=1;i<=n;i++)
         {
             for(int j=1;j<=m;j++)
             cout<<answer[i][j];
             cout<<endl;
         }
}
void show2(int n,int m)
{
    for(int i=1;i<=n;i++)
         {printf("%-4d",i);
             for(int j=1;j<=m;j++)
             {
                for(int k=0;k<4;k++) cout<<point[i][j].visit[k];
             }

             cout<<endl;
         }
}


void solve(int n,int m)
 {   memset(answer,'.',sizeof(answer));
    int x=1,y=1;
    SqStackPush( S,point[x][y]);
    /*x=S.top().x;y=S.top().y;
    cout<<" x= "<<x<<"  y="<<y<<endl;*/
    if(StackEmpty(S))cout<<"kong";
    while(!StackEmpty(S))
    {
        Point top=GetSqStackTop(S);

        //show2(n,m);



        if(point[x][y].visit[0]==0&&point[x][y].vector[0]==1)
    {
        point[x++][y].visit[0]=1;
        point[x][y].visit[1]=1;
        SqStackPush(S,point[x][y]);
    }
    else if(point[x][y].visit[1]==0&&point[x][y].vector[1]==1)
    {
        point[x--][y].visit[1]=1;
        point[x][y].visit[0]=1;
        SqStackPush(S,point[x][y]);
    }
    else if(point[x][y].visit[2]==0&&point[x][y].vector[2]==1)
    {
        point[x][y--].visit[2]=1;
        point[x][y].visit[3]=1;
        SqStackPush(S,point[x][y]);
    }
    else if(point[x][y].visit[3]==0&&point[x][y].vector[3]==1)
    {
        point[x][y++].visit[3]=1;
        point[x][y].visit[2]=1;
       SqStackPush(S,point[x][y]);
    }
    else if(point[x][y].visit[0]==1&&point[x][y].visit[1]==1&&point[x][y].visit[2]==1&&point[x][y].visit[3]==1)
    {SqStackPop(S);if(StackEmpty(S))///当前点上下左右全访问过并且此点不是终点
        {
            cout<<"没有可行路径!\n";break;
        }}

   x=GetSqStackTop(S).x;y=GetSqStackTop(S).y;
   // cout<<" x= "<<x<<"  y="<<y<<endl;


        if(point[x][y].x==n&&point[x][y].y==m)
        {       cout<<"到达终点,通路如下:\n";
            while(!StackEmpty(S))
            {
                Point ans;
                ans.x=GetSqStackTop(S).x;
                ans.y=GetSqStackTop(S).y;
                SqStackPop(S);
             x=ans.x;y=ans.y;
             //cout<<x<<" "<<y<<"   ";
            answer[x][y]='@';
            }
            show(n,m);
            break;
        }
    }

}

int main()
{
    int n,m;
    cout<<"输入行数和列数:\n";
    while(cin>>n>>m)
    {
        memset(point,'x',sizeof(point));//初始化全墙壁
        input(n,m);
        init(n,m);

        //show2(n,m);
        solve(n,m);
        cout<<"输入行数和列数:\n";
    }
    return 0;
}

测试数据:(给一组,稍作改动即是多组)

17 54
.xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
.xxxxxx.......xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.xxxxxxx
.xxxxxx.xxxx.xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx........xx
........xxxx.xxxxxx..........xxxxxxxxxxxxxxxxx.xxxxxxx
xxxxxxx.xxxx.xxxxxx.xxxxxxxxxxxxxxxxxxxxxxxxxx.xxxxxxx
xxxxxxx.xxxx.xxxxxx.xxxxxxxxxxxxxxxxxxxxxxxxxx.xxxxxxx
xxxxxxx.xxxx.xxxxxx.xxxxxxxxxxxxxxxxxxxxxxxxxx.xxxxxxx
xxxxxxx.xxxx.xxxxxx..................xxxxxxxxx.xxxxxxx
xxxxxxx.xxxx.xxxxxx.xxxxxxxxxxxxxxxx.xxxxxxxxx.xxxxxxx
xxxxxxx.............xxxxxxxxxxxxxxxx.xxxxxxxxx.xxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.xxxxxxxxx.xxxxxxx
xxxxxxxxxxxxxxxxxx...................xx........xxxxxxx
xxxxxxxxxxxxxxxxxx.xxxxxxxxxxxxxxxxxxxx.xxxxxx.xxxxxxx
xxxxxxxxxxxxxxxxxx.xxxxxxxxxxxxxxxxxxxx.xxxxxx.xxxxxxx
xxxxxxxxxxxxxxxxxx.xxxxxxxxxxxxxxxxxxxx.xxxxxx......xx
xxxxxxxxxxxxxxxxxx......................xxxxxxxxxxx..x
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx..

    原文作者:迷宫问题
    原文地址: https://blog.csdn.net/protecteyesight/article/details/75005557
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞