#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-搜索
最新推荐文章于 2021-07-24 09:59:45 发布
本文介绍了一种解决双层迷宫问题的搜索算法。该算法通过深度优先搜索(DFS)来寻找从起点到终点的路径,考虑到迷宫由两层组成且可以通过特定符号在两层间切换的特点。迷宫由字符表示,'*'表示障碍物,'#'表示可以在两层间转换的位置。

3956

被折叠的 条评论
为什么被折叠?



