如果骑士们能够在T时刻能找到公主就输出“YES”,否则输出“NO”。
1 5 5 14 S*#*. .#... ..... ****. ...#. ..*.P #.*.. ***.. ...*. *.#..Sample Output
YES题解
两层迷宫,还是BFS的思路,需要注意如果两层同一位置都是传送门是不能走的。
代码
#include<stdio.h>
#include<string.h>
#include<queue>
using namespace std;
struct node
{
int x;
int y;
int z;
}S,E,Ne;
int main()
{
int C,N,M,T,dir[4][2]={1,0,-1,0,0,1,0,-1};
char one[20][20],two[20][20];
scanf("%d",&C);
while(C--)
{
scanf("%d %d %d",&N,&M,&T);
int i,j,o[20][20]={1},t[20][20]={0};
S.x=0;
S.y=0;
S.z=0;
memset(one,0,sizeof(one));
memset(two,0,sizeof(two));
for(i=0;i<N;i++)scanf("%s",one[i]);
for(i=0;i<N;i++)scanf("%s",two[i]);
int flag=0;
for(i=0;i<N;i++)
{
for(j=0;j<M;j++)
{
if(one[i][j]=='P')
{
E.x=i;
E.y=j;
E.z=0;
flag=1;
}
if(flag)break;
if(two[i][j]=='P')
{
E.x=i;
E.y=j;
E.z=1;
flag=1;
}
if(flag)break;
}
if(flag)break;
}
flag=0;
queue<node> qu;
int count=0;
qu.push(S);
while(count<T)//时间限制
{
count++;
int l=qu.size();
while(l--)
{
S=qu.front();
qu.pop();
for(i=0;i<4;i++)
{
Ne.x=S.x+dir[i][0];
Ne.y=S.y+dir[i][1];
Ne.z=S.z;
if(Ne.z==0)//在第一层
{
if(one[Ne.x][Ne.y]=='P')
{
printf("YES\n");
flag=1;
}
else if(one[Ne.x][Ne.y]=='.'&&o[Ne.x][Ne.y]==0&&Ne.x>=0&&Ne.x<N&&&Ne.y>=0&&Ne.y<M)
{
o[Ne.x][Ne.y]=1;
qu.push(Ne);
}
else if(one[Ne.x][Ne.y]=='#'&&o[Ne.x][Ne.y]==0&&Ne.x>=0&&Ne.x<N&&&Ne.y>=0&&Ne.y<M)//跳转
{
if(two[Ne.x][Ne.y]=='P')
{
printf("YES\n");
flag=1;
}
else if(t[Ne.x][Ne.y]==0&&two[Ne.x][Ne.y]!='*'&&two[Ne.x][Ne.y]!='#')
{
Ne.z=1;
qu.push(Ne);
Ne.z=0;
t[Ne.x][Ne.y]=1;
}
o[Ne.x][Ne.y]=1;
}
}
else if(Ne.z==1)//在第二层
{
if(two[Ne.x][Ne.y]=='P')
{
printf("YES\n");
flag=1;
}
else if(two[Ne.x][Ne.y]=='.'&&t[Ne.x][Ne.y]==0&&Ne.x>=0&&Ne.x<N&&&Ne.y>=0&&Ne.y<M)
{
t[Ne.x][Ne.y]=1;
qu.push(Ne);
}
else if(two[Ne.x][Ne.y]=='#'&&t[Ne.x][Ne.y]==0&&Ne.x>=0&&Ne.x<N&&&Ne.y>=0&&Ne.y<M)//跳转
{
if(one[Ne.x][Ne.y]=='P')
{
printf("YES\n");
flag=1;
}
else if(o[Ne.x][Ne.y]==0&&one[Ne.x][Ne.y]!='*'&&one[Ne.x][Ne.y]!='#')
{
Ne.z=0;
qu.push(Ne);
o[Ne.x][Ne.y]=1;
}
t[Ne.x][Ne.y]=1;
}
}
}
if(flag)break;
}
if(flag)break;
}
if(!flag)printf("NO\n");
}
}