**题目链接:**
//http://acm.hdu.edu.cn/showproblem.php?pid=2102
**题目分析:**
被大神们说成水题的搜索,我硬是交了N遍一直WA,只能默默地测试,找BUG,终于还是
让我AC了。现在来分析一下这道题:看到此题,首先,应该想到的是用BFS,来写比较简单;然后,
注意它的起点是(0,0,0),终点P(x,y,z),由于是两层,当然要利用三维数组来存储,记录下终点
位置;接下来就是BFS了,搜索时注意'.'是路,'#'是时空传输机,‘*’是墙;主要是注意一下,
判断的条件,其他的就比较简单了,直接上代码吧。
**代码:**
<span style="font-size:14px;">#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <algorithm>
#include <queue>
using namespace std;
int C,N,M,T;
const int MAX_N = 1000;
const int INF = 0x7ffffff;
char map[2][MAX_N][MAX_N]; //地图
int d[2][MAX_N][MAX_N]; //到能够到达点的最短距离
bool visit[2][MAX_N][MAX_N]; //用于标记
int gx,gy,gz; //起点已给,记录终点
typedef struct{
int z,x,y;
}P;
int dx[6] ={1,0,-1,0,0,0};
int dy[6] ={0,-1,0,1,0,0};
int dz[6] ={0,0,0,0,1,-1};
void bfs()
{
P p,q;
p.z = 0;
p.x = 0;
p.y = 0;
queue<P>que;
que.push(p);
d[0][0][0] = 0;
visit[0][0][0] = true;
while(que.size())
{
q = que.front();
que.pop();
if(q.x == gx && q.y == gy && q.z == gz)
{
if(d[q.z][q.x][q.y] <= T)
{
printf("YES\n");
}
else
{
printf("NO\n");
}
return ;
}
if(map[q.z][q.x][q.y]=='.' ||(q.z == 0 && q.x==0 && q.y == 0))
{ //要是是起点或者是'.'则在该层上的四个方向上访问;
for(int i = 0 ;i < 4 ; i++)
{
int nx = dx[i]+q.x;
int ny = dy[i]+q.y;
int nz = q.z;
if(nx>=0&&ny>=0&&nz>=0 && nx<N&&ny<M&& nz<2 && !visit[nz][nx][ny] && map[nz][nx][ny] != '*')
{
p.x = nx;
p.y = ny;
p.z = nz;
que.push(p);
visit[nz][nx][ny] = true;
d[nz][nx][ny] = d[q.z][q.x][q.y] + 1 ;
}
}
}
//要是是'#'则跳转至另一层上去访问;
if(map[q.z][q.x][q.y] == '#')
{
for(int i=4;i<6;i++)
{
int nz = dz[i]+q.z;
int nx = q.x;
int ny = q.y;
//注意判断条件,以及入队条件
if(nx>=0 && ny>=0 && nz>=0 && nx<N && ny<M && nz<2 && !visit[nz][nx][ny])
{
visit[nz][nx][ny] = true;
if(map[nz][nx][ny] == '.'|| map[nz][nx][ny] == 'P')
{
p.x = nx;
p.y = ny;
p.z = nz;
que.push(p);
d[nz][nx][ny] = d[q.z][q.x][q.y];
}
}
}
}
}
printf("NO\n");
}
void solve()
{
cin>>C;
while(C--)
{
cin>>N>>M>>T;
for(int i = 0 ; i < 2;i++)
{
for(int j=0;j<N;j++)
{
for(int k=0;k<M;k++)
{
cin>>map[i][j][k];
d[i][j][k] = INF;
visit[i][j][k] = false;
if(map[i][j][k] == 'P')
{
gz = i;
gx = j;
gy = k;
}
}
}
}
bfs();
}
}
int main()
{
solve();
return 0;
}
</span>