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;
}