#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
int n,m,t,xx[4][2]={{1,0},{0,1},{-1,0},{0,-1}},xp,yp,visit[2][11][11]; //xp、yp是终点坐标
char map[2][11][11]; //因为有两层,所以用三维
void input(int x) //输入地图,因为要输入两次,所以写个子函数减少代码长度--!
{
for(int i=0;i<n;i++)
for(int j=0;j<m;j++)
{
visit[x][i][j]=1; //顺便初始化visit数组
cin>>map[x][i][j];
if(map[x][i][j]=='P')xp=i,yp=j; //把终点坐标记录下来
}
}
int ABS(int a) //求绝对值
{
return a>0?a:-a;
}
bool dfs(int X,int Y,int Z,int step)
{
int i,j,k,l,x,y,z;
if(map[Z][X][Y]=='P')return 1; //到终点了
if(step==0)return 0; //没时间了
x=ABS(X-xp)+ABS(Y-yp); //x里面放当前地点到终点的最短距离
if(x>step)return 0; //剩余时间不够
for(i=0;i<4;i++)
{
x=X+xx[i][0];
y=Y+xx[i][1];
z=Z;
if(x>=0&&y>=0&&x<n&&y<m&&visit[z][x][y]&&map[z][x][y]!='*') //不出界,visit标记没访问,地图不是*
{
if(map[z][x][y]=='#')z=1-z; //如果是#就要变到另外一层
visit[z][x][y]=0;
if(map[z][x][y]!='#'&&map[z][x][y]!='*'&&dfs(x,y,z,step-1))return 1; //不允许是*和#,*会撞死,#会无线循环
visit[z][x][y]=1;
}
}
return 0;
}
int main (void)
{
int T,i,j,k,l;
cin>>T;
while(T--&&cin>>n>>m>>t)
{
input(0);
input(1);
if(dfs(0,0,0,t))cout<<"YES"<<endl;
else cout<<"NO"<<endl;
}
return 0;
}
hdu 2102-搜索
最新推荐文章于 2017-07-26 10:44:33 发布