HDU 2102 双层bfs

来源:互联网 发布:最新传奇扫号软件 编辑:程序博客网 时间:2024/04/30 06:15

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

#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;elsep.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;}


原创粉丝点击