HDU-1253-胜利大逃亡-BFS(以及辨析BFS在求最大连通分量和求最短路径的区别)

在本题中,应将每一个Node中加一个时间变量t,而不要另外设置一个time来做,因为用BFS计算时间的时,在扩展下一个状态时,是从与其相连的多个结点中挑一个,这多个节点的时间都是now.t+1。也要注意本题与HDU red and black那道题的区别,那道题是为了统计最大连通分量中结点的个数,因此必须另外设置一个变量num来统计已经遍历的点的个数,而不能将num设置到Node里。因此以后在做BFS的题目时要注意是用BFS来统计最大连通分量中结点的个数,还是用来统计最短时间或者最短路径。二者的区别就是是否将统计变量num或者t设置到结构体Node中。

#include
#include

using namespace std;

typedef struct Node
{
    int x, y, z, t;
}Node;

queue 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在求最大连通分量和求最短路径的区别))