描述
木乃伊地下宫殿是一个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;
}
注意此题中的墙和其他迷宫墙的区别