木乃伊迷宫(格子边缘是墙的问题)

1147.木乃伊迷宫

时限:1000ms 内存限制:10000K  总时限:3000ms

描述

木乃伊地下宫殿是一个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<queue>
#include <cstring>
using namespace std;
struct qiang
{
    int N,S,W,E;
}mapp[6][6];
int vis[6][6];
int dirx[4]={-1,1,0,0};
int diry[4]={0,0,-1,1};
struct Node
{
    int x,y,x1,y1;
}renmu;
queue <Node> q;
struct node
{
    int x,y;
}e;
int judge(Node X,int i)
{
    if(X.x<0||X.x>=6||X.y<0||X.y>=6||vis[X.x][X.y]==1) return 0;

    if(i==0)        {if(mapp[X.x][X.y].N==1) return 0;}
    else if(i==1)   {if(mapp[X.x][X.y].S==1) return 0;}
    else if(i==2)   {if(mapp[X.x][X.y].W==1) return 0;}
    else if(i==3)   {if(mapp[X.x][X.y].E==1) return 0;}
    return 1;
}
void bfs()
{
    Node now,next;
    q.push(renmu);
    int i;
    while(!q.empty())
    {
        now=q.front();
        q.pop();
        if(now.x==e.x&&now.y==e.y)
        {
            printf("Yes\n");
            return;
        }
        for(i=0;i<4;i++)
        {
            next.x=now.x+dirx[i];
            next.y=now.y+diry[i];
            if(judge(next,i))
            {
                vis[next.x][next.y]=1;
                int temp=2;
                while(now.y1!=now.y&&temp>0)
                {
                    if(now.y1>now.y&&mapp[now.x1][now.y1].W==0)         now.y1--;
                    else if(now.y1<now.y&&mapp[now.x1][now.y1].E==0)    now.y1++;
                    temp--;
                }
                while(temp>0)
                {
                    if(now.x1>now.x&&mapp[now.x1][now.y1].N==0)         now.x1--;
                    else if(now.x1<now.x&&mapp[now.x1][now.y1].S==0)    now.x1++;
                    if(now.x1==now.x&&now.y1==now.y)                    break;
                    temp--;
                }
                if(temp==0)
                {
                    next.x1=now.x1;  next.y1=now.y1;
                    q.push(next);
                }
            }
        }
    }
    printf("No\n");
}
int main()
{

   node temp;
   int n;
   int sign;
   memset(mapp,0,sizeof(mapp));
   memset(vis,0,sizeof(vis));
   scanf("%d",&n);
   while(n--)
   {
       scanf("%d%d%d",&temp.x,&temp.y,&sign);
       if(sign==0)
       {
           mapp[temp.x][temp.y].S=1;
           mapp[temp.x+1][temp.y].N=1;
       }
       else if(sign==1)
       {
           mapp[temp.x][temp.y].E=1;
           mapp[temp.x][temp.y].W=1;
       }
   }
   scanf("%d%d",&renmu.x1,&renmu.y1);
   scanf("%d%d",&renmu.x,&renmu.y);
   scanf("%d%d",&e.x,&e.y);
   bfs();
   return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值