Fire! UVA 11624

http://acm.hust.edu.cn/vjudge/contest/121377#problem/J

题意: 有一个人 'J' 身处迷宫, 迷宫四周有墙 '#', 还有火的源点 'F',当然,火会向上下左右四个方向蔓延, 问你 'J' 能否逃出这个迷宫。

 

注意:  火的源点可能不止有一个, 也有可能一个也没有。

#include<stdio.h>
#include<string.h>
#include<math.h>
#include<algorithm>
#include<queue>
using namespace std;
typedef long long LL;
#define oo 0x3f3f3f3f
#define maxn 1500
int dir[4][2]={{0, 1},{1, 0},{0, -1},{-1, 0}};
char maps[maxn][maxn];
int  v1[maxn][maxn], v2[maxn][maxn];
int n, m, nfir;

struct node
{
    int x, y;
};

node fir[maxn*maxn];
void BFSFIR()
{
    queue<node>Q;

    for(int i=0; i<nfir; i++)
    {
        Q.push(fir[i]);
        v1[fir[i].x][fir[i].y]=1;
    }

    while(Q.size())
    {
        node now, next;
        now = Q.front();
        Q.pop();

        for(int i=0; i<4; i++)
        {
            next.x =now.x+dir[i][0];
            next.y = now.y+dir[i][1];
            if(next.x>=0 && next.x<n && next.y>=0 && next.y<m && v1[next.x][next.y]==oo && maps[next.x][next.y]!='#')
            {
                v1[next.x][next.y] = v1[now.x][now.y]+1;
                Q.push(next);
            }
        }
    }
}

int BFS(node p)
{
    queue<node>Q;
    Q.push(p);
    node now, next;
    v2[p.x][p.y] = 1;

    while(Q.size())
    {
        now = Q.front();
        Q.pop();

        if((now.x==0 || now.x==n-1 || now.y==0 || now.y==m-1) && v2[now.x][now.y] < v1[now.x][now.y])
             return v2[now.x][now.y];

        for(int i=0; i<4; i++)
        {
            next.x =now.x+dir[i][0];
            next.y = now.y+dir[i][1];
            if(next.x>=0 && next.x<n && next.y>=0 && next.y<m
            && !v2[next.x][next.y] && maps[next.x][next.y]!='#')
            {
               v2[next.x][next.y] = v2[now.x][now.y]+1;
                Q.push(next);
            }
        }
    }
    return -1;
}

int main()
{
    int T;
    node  s;

    scanf("%d",&T);

    while(T--)
    {
        nfir = 0;

        scanf("%d %d", &n, &m);

        for(int i=0; i<n; i++)
        {
            scanf("%s",maps[i]);
            for(int j=0; j<m; j++)
            {
                v1[i][j] = oo;
                if(maps[i][j] == 'J')
                    s.x=i,s.y=j;
                if(maps[i][j] == 'F')
                {
                    fir[nfir].x=i,fir[nfir].y=j;
                    nfir++;
                }
            }
        }


       BFSFIR();

       memset(v2, 0, sizeof(v2));

       int ans = BFS(s);

        if(ans == -1)  printf("IMPOSSIBLE
");
        else printf("%d
", ans);

    }
    return 0;
}
View Code
原文地址:https://www.cnblogs.com/daydayupacm/p/5687078.html