传送门:点击打开链接
解题思路:两层,#表示楼梯,然后基本的bfs,注意特殊的这些情况,两层的同一个位置都是楼梯,会进入无限循环导致TLE。下楼或上楼撞墙死的也要筛掉。bfs或dfs都可以,图不大建议bfs吧快点,bfs0ms,不过oj不怎么稳定有时候会15ms
AC代码如下:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
using namespace std;
struct node
{
int x,y,z,time;
};
char map[2][12][12];
int book[2][12][12],n,m,T,nex[4][2]={0,1,1,0,0,-1,-1,0};
queue<node> que;
bool judge(int x,int y)
{
if(x<0||x>=n||y<0||y>=m)
return true;
return false;
}
bool bfs(int x,int y,int z)
{
node now,xia;
int i;
while(!que.empty())
que.pop();
now.x=x;
now.y=y;
now.z=z;
now.time=0;
que.push(now);
while(!que.empty())
{
now=que.front();
que.pop();
for(i=0;i<4;i++)
{
xia.x=now.x+nex[i][0];
xia.y=now.y+nex[i][1];
xia.z=now.z;
xia.time=now.time+1;
if(xia.time>T || judge(xia.x,xia.y) || map[xia.z][xia.x][xia.y]=='*' || book[xia.z][xia.x][xia.y])
continue;
if(map[xia.z][xia.x][xia.y]=='#')
{
xia.z=!xia.z;
if(map[xia.z][xia.x][xia.y]=='*' || map[xia.z][xia.x][xia.y]=='#')
continue;
}
if(map[xia.z][xia.x][xia.y]=='P')
return false;
book[xia.z][xia.x][xia.y]=1;
que.push(xia);
}
}
return true;
}
int main()
{
int t,i,j,k,Sx,Sy,Sz;
cin>>t;
while(t--)
{
cin>>n>>m>>T;
memset(book,0,sizeof(book));
for(i=0;i<2;i++)
{
getchar();
for(j=0;j<n;j++)
scanf("%s",map[i][j]);
getchar();
}
for(i=0;i<2;i++)
for(j=0;j<n;j++)
for(k=0;k<m;k++)
if(map[i][j][k]=='S')
Sx=j,Sy=k,Sz=i;
if(bfs(Sx,Sy,Sz))
printf("NO\n");
else
printf("YES\n");
}
return 0;
}