UVA11624(bfs)

 

题目链接:http://acm.hust.edu.cn/vjudge/contest/view.action?cid=65959#problem/J

题意:一个平面迷宫中有一个人,迷宫中有些点起火了,火和人每个单位时间只能向相邻的格子移动,其中有一些空间被墙壁占据,问这个人在不背或烧到的情况下,离开迷宫的最快时间。

分析:因为人要在火烧到之前逃离,所以先bfs火到达每个点的最短时间,再对人bfs逃离路径时根据到达每个点的时间是否少于火到达该点的时间。火竟然不止一处,坑爹啊,被这里坑惨了T^^T。。。

 

#include <cstdio>

#include <cstring>

#include <cmath>

#include <iostream>

#include <algorithm>

#include <queue>

#include <cstdlib>

#include <stack>

#include <vector>

#include <set>

#include <map>

#define LL long long

#define mod 1000000007

#define inf 0x3f3f3f3f

#define N 100010

using namespace std;

int n,m;

char s[1110][1010];

int vis[1010][1010];

int step1[1010][1010],step2[1010][1010];

struct node

{

    int x,y;

};

int dx[]={0,0,1,-1};

int dy[]={1,-1,0,0};

int judge(int x,int y)

{

    return x>=0&&x<n&&y>=0&&y<m&&s[x][y]!='#';

}

void bfs1()

{

    queue<node>que;

    while(!que.empty())que.pop();

    memset(vis,0,sizeof(vis));

    node cur,nxt;

    for(int i=0;i<n;i++)

        for(int j=0;j<m;j++)

    {

        if(s[i][j]=='F')

        {

            cur.x=i;cur.y=j;

            que.push(cur);

            step1[i][j]=0;vis[i][j]=1;

        }

    }

    while(!que.empty())

    {

        cur=que.front();que.pop();

        int xx=cur.x,yy=cur.y;

        for(int i=0;i<4;i++)

        {

            int a=xx+dx[i],b=yy+dy[i];

            if(judge(a,b)&&!vis[a][b])

            {

                step1[a][b]=step1[xx][yy]+1;

                vis[a][b]=1;

                nxt.x=a,nxt.y=b;

                que.push(nxt);

            }

        }

    }

}

int bfs2(int x,int y)

{

    queue<node>que;

    while(!que.empty())que.pop();

    memset(vis,0,sizeof(vis));

    node cur,nxt;

    cur.x=x;cur.y=y;

    que.push(cur);

    vis[x][y]=1;

    while(!que.empty())

    {

        cur=que.front();que.pop();

        int xx=cur.x,yy=cur.y;

        if(xx==0||xx==n-1||yy==0||yy==m-1)

            return step2[xx][yy]+1;

        for(int i=0;i<4;i++)

        {

            int a=xx+dx[i],b=yy+dy[i];

            if(s[a][b]!='#'&&!vis[a][b]&&step2[xx][yy]+1<step1[a][b])

            {

                step2[a][b]=step2[xx][yy]+1;

                vis[a][b]=1;

                nxt.x=a,nxt.y=b;

                que.push(nxt);

            }

        }

    }

    return -1;

}

int main()

{

    int x,y,a,b,t;

    scanf("%d",&t);

    while(t--)

    {

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

        for(int i=0;i<n;i++)

            scanf("%s",s[i]);

        for(int i=0;i<n;i++)

        for(int j=0;j<m;j++)

        {

            if(s[i][j]=='J')

            {

                a=i;b=j;

            }

        }

        memset(step1,0x3f,sizeof(step1));

        memset(step2,0,sizeof(step2));

        bfs1();

        int ans=bfs2(a,b);

        if(ans==-1)puts("IMPOSSIBLE");

        else printf("%d\n",ans);

    }

    return 0;

}
View Code

 

你可能感兴趣的:(bfs)