在本题中,应将每一个Node中加一个时间变量t,而不要另外设置一个time来做,因为用BFS计算时间的时,在扩展下一个状态时,是从与其相连的多个结点中挑一个,这多个节点的时间都是now.t+1。也要注意本题与HDU red and black那道题的区别,那道题是为了统计最大连通分量中结点的个数,因此必须另外设置一个变量num来统计已经遍历的点的个数,而不能将num设置到Node里。因此以后在做BFS的题目时要注意是用BFS来统计最大连通分量中结点的个数,还是用来统计最短时间或者最短路径。二者的区别就是是否将统计变量num或者t设置到结构体Node中。
#include <stdio.h>
#include <queue>using namespace std;
typedef struct Node
{
int x, y, z, t;
}Node;queue<Node> Q;
int map[50][50][50];
int go[][3] = {1,0,0, -1,0,0, 0,1,0, 0,-1,0, 0,0,1, 0,0,-1};
int BFS(int a, int b, int c)
{
Node now;
int nx, ny, nz;
while(!Q.empty())
{
now = Q.front();
Q.pop();
for(int i = 0; i < 6; i++)
{
nx = now.x + go[i][0];
ny = now.y + go[i][1];
nz = now.z + go[i][2];
if(nx < 0 || nx >= a || ny < 0 || ny >= b || nz < 0 || nz >= c)
continue;
if(map[nx][ny][nz] == 1)
continue;
Node tmp;
tmp.x = nx;
tmp.y = ny;
tmp.z = nz;
tmp.t = now.t + 1;
map[nx][ny][nz] = 1;
Q.push(tmp);
if(nx == a-1 && ny == b-1 && nz == c-1)
return tmp.t;
}
}
}int main()
{
int k, a, b, c, t;
scanf("%d", &k);
while(k--)
{
scanf("%d %d %d %d", &a, &b, &c, &t);
for(int i = 0; i < a; i++)
for(int j = 0; j < b; j++)
for(int z = 0; z < c; z++)
scanf("%d", &map[i][j][z]);
while(!Q.empty())
Q.pop();
Node start;
start.x = start.y = start.z = 0;
start.t = 0;
map[start.x][start.y][start.z] = 1; //改为墙
Q.push(start);
int ans = BFS(a, b, c);
if(ans <= t)
printf("%d\n", ans);
else
printf("-1\n");
}
return 0;
}
HDU-1253-胜利大逃亡-BFS(以及辨析BFS在求最大连通分量和求最短路径的区别)
最新推荐文章于 2022-10-16 03:57:55 发布