木乃伊问题

描述

木乃伊地下宫殿是一个6行6列的迷宫。作为敢到木乃伊地下宫殿里去探险的你,有没有跟木乃伊抓迷藏的心理准备呵!游戏在木乃伊所在的迷宫里展开,任务就是尽快赶到出口。你一次只能走一步,而木乃伊可以走两步,但木乃伊是很笨的,他总是先尽量跟你达到同一列,如果已经是同一列了,他才会像你走来,有墙的地方人和木乃伊都不能过,你可以利用障碍物牵制住木乃伊。

 

输入

先输入墙的数量n,然后在后续的n行里每行有3个数表示一堵墙,3个数分别为格子的行、列和墙的位置(0表示这个格子的下方是墙,1表示这个格子的右方是墙),再下来的3行每行2个数,分别表示木乃伊、人还有出口的位置。

 

输出

    如果能安全逃生则输出Yes,否则输出No,答案占一行。

 

输入样例

5
0 0 0
1 1 1
1 4 1
3 4 1
4 3 0
3 3
3 1
5 5

 

输出样例

No

#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
using namespace std;
int dir[4][2]={{0,1},{0,-1},{1,0},{-1,0}};
int vis[6][6][6][6];
int ma[6][6][2];
int rx,ry,mx,my,ex,ey,direction;
struct node
{
    int rx;
    int ry;
    int mx;
    int my;
};
int isaim(node m)
{
    if(m.rx==ex&&m.ry==ey)
    {
        return 1;
    }
    return 0;
}
int unsafe(node m)
{
    if(m.rx==m.mx&&m.ry==m.my)
    {
        return 1;
    }
    return 0;
}
int rcanmove(node m,int i)
{
    int rrow=m.rx;
    int rcol=m.ry;
    if((ma[rrow][rcol][1]==1&&i==0)||(ma[rrow][rcol][0]==1&&i==2)||(ma[rrow][rcol-1][1]==1&&i==1)||(ma[rrow-1][rcol][0]==1&&i==3)
       ||(rrow==0&&i==3)||(rrow==5&&i==2)||(rcol==0&&i==1)||(rcol==5&&i==0))
    {
        return 0;
    }
    return 1;
}
node rmoveto(node m,int i)
{
    m.rx+=dir[i][0];
    m.ry+=dir[i][1];
    return m;
}
node mcanmove(node m)
{
    int rrow=m.rx;
    int rcol=m.ry;
    int mrow=m.mx;
    int mcol=m.my;
    int n=2;
    while(n--)
    {
    if(rcol>mcol)
    {
        if(ma[mrow][mcol][1]!=1)
        {
        mcol++;
        }
    }
    else if(rcol<mcol)
    {
        if(ma[mrow][mcol-1][1]!=1)
        {
            mcol--;
        }
    }
    else
    {
        if(rrow<mrow)
        {
            if(ma[mrow-1][mcol][0]!=1)
            {
                mrow--;
            }
        }
        else if(rrow>mrow)
        {
            if(ma[mrow][mcol][0]!=1)
           {
            mrow++;
           }
        }
    }
    }
    m.mx=mrow;
    m.my=mcol;
    m.rx=rrow;
    m.ry=rcol;
    return m;
}
int bfs()
{
    queue<node>q;
    node a,t,next;
    t.rx=rx;
    t.ry=ry;
    t.mx=mx;
    t.my=my;
    q.push(t);
    vis[t.rx][t.ry][t.mx][t.my]=1;
    while(!q.empty())
    {
        a=q.front();
        q.pop();
        for(int i=0;i<4;i++)
        {
            if(rcanmove(a,i))
            {
                next=rmoveto(a,i);
                next=mcanmove(next);
                if(vis[next.rx][next.ry][next.mx][next.my]==0)
                {
                    if(!unsafe(next))
                    {
                        if(isaim(next))
                        {
                            return 1;
                        }
                        else
                        {
                            vis[next.rx][next.ry][next.mx][next.my]=1;
                            q.push(next);
                        }
                    }
                    else
                    {
                        continue;
                    }
                }
            }
        }
    }
   return 0;
}
int main()
{
    int n,flag,a,b,c;
    flag=0;
    memset(ma,0,sizeof(ma));
    memset(vis,0,sizeof(vis));
    cin>>n;
    while(n--)
    {
        cin>>a>>b>>c;
        ma[a][b][c]=1;
    }
    cin>>mx>>my;
    cin>>rx>>ry;
    cin>>ex>>ey;
    flag=bfs();
    if(mx==rx&&my==ry)
    {
        flag=0;
    }
    if(rx==ex&&ry==ey)
    {
        flag=1;
    }
    if(flag==1)cout<<"Yes"<<endl;
    else cout<<"No"<<endl;
    return 0;
}
注意此题中的墙和其他迷宫墙的区别

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值