迷宫

题目描述

给出一个N*N的迷宫矩阵示意图,从起点[0,0]出发,寻找路径到达终点[N-1, N-1]

要求使用堆栈对象来实现,具体算法参考课本3.2.4节51页

 

输入

第一行输入t,表示有t个迷宫

第二行输入n,表示第一个迷宫有n行n列

第三行起,输入迷宫每一行的每个方格的状态,0表示可通过,1表示不可通过

输入n行

以此类推输入下一个迷宫

输出

逐个输出迷宫的路径

如果迷宫不存在路径,则输出no path并回车

如果迷宫存在路径,将路径中每个方格的x和y坐标输出,从起点到终点,每输出四个方格就换行,最终以单词END结尾,具体格式参考示范数据

输出的代码参考如下:

//path是保存路径的堆栈,堆栈中每个元素都包含x坐标和y坐标,用属性xp和yp表示

//path1是一个临时堆栈,把path的数据倒序输出到path1,使得路径按正序输出

if (!path.empty()) //找到路径

{ //......若干代码,实现path的数据导入path1

i=0;  //以下是输出路径的代码

while (!path1.empty())

{ cpos = path1.top();

if ( (++i)%4 == 0 ) 

cout<<'['<<cpos.xp<<','<<cpos.yp<<']'<<"--"<<endl;

else

cout<<'['<<cpos.xp<<','<<cpos.yp<<']'<<"--";

path1.pop();

}

cout<<"END"<<endl;

}

else

cout<<"no path"<<endl; //找不到路径输出no path

样例输入

2

8

0 0 0 1 1 1 1 1 1 0 0 0 1 0 0 1 1 0 0 0 1 0 0 0 1 1 0 0 0 0 0 1 0 0 1 1 0 1 1 0 0 0 0 0 0 0 1 1 1 1 1 1 1 0 0 1 0 0 0 0 1 0 0 0

7

0 0 0 1 1 1 1 1 0 0 1 0 0 1 1 0 0 1 0 0 0 1 1 0 0 0 0 1 0 0 1 1 0 1 0 1 0 0 0 0 1 0 0 0 0 0 1 1 0

样例输出

[0,0]--[0,1]--[0,2]--[1,2]-- [1,3]--[2,3]--[3,3]--[3,4]-- [4,4]--[5,4]--[5,5]--[6,5]-- [6,6]--[7,6]--[7,7]--END

no path

 

 

#include<bits/stdc++.h>
using namespace std;
int mg[50][50];
int n;
int nextdir[4][2]={{0,1},{1,0},{0,-1},{-1,0}};
struct Point
{
    int x,y;
    int dir;    
};
int find()
{
    stack<Point> p;
    Point start,now,pro;
    int flag=0;
    start.x=1;
    start.y=1;
    start.dir=0;
    pro=start;
//  p.push(start);
//  mg[0][0]=-1;.
    now.x=start.x;
    now.y=start.y;
    while(now.x!=n||now.y!=n)
    {
        //pro=p.top();
        now.x=pro.x+nextdir[pro.dir][0];
        now.y=pro.y+nextdir[pro.dir][1];
        now.dir=pro.dir;
        if(now.x==n&&now.y==n)
        {
            p.push(pro);
            p.push(now);
            break;
        }
        if(mg[now.x][now.y]==0)
        {
            Point a;
            a.x=pro.x;
            a.y=pro.y;
            a.dir=pro.dir;
            p.push(a);
            mg[pro.x][pro.y]=-1;
            pro.x=now.x;
            pro.y=now.y;
            pro.dir=0;
        }
        else
        {
            pro.dir++;
            while(pro.dir>3)
            {
                if(!p.empty())
                {
                    Point a;
                    a=p.top();
                    pro.x=a.x;
                    pro.y=a.y;
                    pro.dir=a.dir;
                    p.pop();
                    pro.dir++;
                }
              
            }
        }
        if(now.x==1&&now.y==1)
            return 0;
    }
    stack<Point> s;
    while(!p.empty())
    {
        s.push(p.top());
        p.pop();    
    }
    while(!s.empty())
    {
        flag++;
        cout<<"["<<s.top().x-1<<","<<s.top().y-1<<"]--";
        if(flag%4==0)
            cout<<endl;   
        s.pop();
    }
    return 1;
}
int main()
{
    int t,i,j;
    cin>>t;
    while(t--)
    {
        cin>>n;
        for(i=1;i<=n;i++)
            for(j=1;j<=n;j++)
                cin>>mg[i][j];
        for(i=0;i<n+2;i++)
        {
            mg[0][i]=1;
            mg[i][0]=1;
            mg[i][n+1]=1;
            mg[n+1][i]=1;
        }
        if(find())
            cout<<"END"<<endl;
        else
            cout<<"no path"<<endl;
    }
    return 0;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值