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; }
相关文章推荐
- hdu 2102 A计划(双层BFS)(详解)
- HDU 2102 A计划 双层BFS
- hdu 2102 A计划(双层BFS)(具体解释)
- H - A计划 HDU - 2102 (BFS搜索)
- hdu 2102 A计划(bfs)
- HDU-2102 A计划 BFS
- HDU 2102 A计划(三维BFS)
- HDU 2102 A计划 bfs
- hdu 2102 A计划 bfs
- [BFS] HDU 2102
- HDU 2102 A计划 BFS
- H - A计划 HDU - 2102----普通BFS注意坑点
- HDU 2102 A计划 BFS
- hdu 2102 A计划(BFS)(H)
- hdu 2102 A计划 BFS
- hdu 2012 A计划 双层bfs
- hdu 2102 A计划 BFS
- HDU 2102 A计划( BFS广度优先搜索)
- hdu 2102 A计划(bfs)
- HDU 2102 A计划(BFS)