您的位置:首页 > 其它

HDU 2102 双层bfs

2012-09-12 15:03 369 查看
这个题目其实也是广搜,只是不同于以往的两层监狱的直接广搜,而是当遇到时空传输机的时候如果条件满足会被送到另一层对应位置。因此,该题还在一维空间上广搜,当遇到时空传输机时跳转到另一层然后接着执行一维空间上的广搜。

#include <iostream>
#include <queue>
using namespace std;
typedef struct
{
int x;
int y;
int z;
int time;
}point;
char map[2][12][12];
int n,m,t,mark[2][12][12];
int dir[4][2]={{0,1},{0,-1},{1,0},{-1,0}};
void   bfs()
{
queue<point>Q;
point p,q;
int i;
p.x = 0 ;
p.y = 0 ;
p.z = 0 ;
p.time = 0 ;
Q.push(p);
mark[0][0][0] = 1;
while(!Q.empty())
{
q = Q.front();
Q.pop();
for(i = 0 ; i < 4 ; i++)
{
p.x = q.x ; //x用来表示在哪一个楼层上
p.y = q.y + dir[i][0] ;
p.z = q.z + dir[i][1] ;
if(p.y >= 0 && p.y < n && p.z >= 0 && p.z < m && map[p.x][p.y][p.z] != '*' && mark[p.x][p.y][p.z] == 0)
{//如果找到某个可行点
if(map[p.x][p.y][p.z] == '#')
{//如果该点是时空传输机则修改p.x的值即跳到另一层
if(p.x)
p.x=0;
else
p.x=1;
if(mark[p.x][p.y][p.z])
continue;
}
mark[p.x][p.y][p.z] = 1 ;
p.time = q.time + 1 ;
if(p.time > t)
{
printf("NO\n");
return ;
}
if(map[p.x][p.y][p.z] == 'P')
{
printf("YES\n");
return ;
}
Q.push(p);
}
}
}
printf("NO\n");
}
int main()
{
int cases;
int i,j;
scanf("%d",&cases);
while(cases--)
{
scanf("%d %d %d",&n,&m,&t);
memset(mark,0,sizeof(mark));
for(i = 0 ; i < 2 ; i++)
for(j = 0 ; j < n ; j++)
scanf("%s",&map[i][j]);
for(i = 0 ; i < n ; i++)
for(j = 0 ; j < m ; j++)
if(map[0][i][j] == '#' && map[1][i][j] == '*')
map[0][i][j] = '*';
else if(map[0][i][j] == '*' && map[1][i][j] == '#')
map[1][i][j] = '*';
else if(map[0][i][j] == '#' && map[1][i][j] == '#')
map[0][i][j] = map[1][i][j] = '*';
bfs();
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: