您的位置:首页 > 其它

UVA 11264 Fire!

2015-06-09 21:25 267 查看
第一次bfs把火到各点燃烧的最短时间计算出并存储

第二次bfsXX如果走到该点的时间大于等于火烧到这点所用的时间 那么不入队(XX必然被烧死

不过第一次写只用了一次bfs 把火和人同时入队  难道是造成混乱?  反正无限WA

坑点是一开始人就站在了边界处  输出1

#include<iostream>

#include<cstdio>

#include<cstring>

#include<cmath>

#include<algorithm>

#include<queue>

#define INF 0x3f3f3f3f

using namespace std;

int ftime[1005][1005];

int vis[1005][1005];

char Map[1005][1005];

int R,C;
int dir[4][2]={{-1,0},{1,0},{0,-1},{0,1}};

struct node{

    int x,y;

    int step;

};

queue<node> que;

int st_x,st_y;

void bfs1()

{

    memset(ftime,INF,sizeof(ftime));

    node st,en;

    while(!que.empty()){

        st=que.front();

        que.pop();

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

            en.x=st.x+dir[i][0];

            en.y=st.y+dir[i][1];

            en.step=st.step+1;

            if(en.x<0||en.x>=R||en.y<0||en.y>=C||Map[en.x][en.y]=='#')

                continue;

            if(en.step<ftime[en.x][en.y]){

                ftime[en.x][en.y]=en.step;

                que.push(en);

            }

        }

    }

}

int bfs2()

{

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

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

    node st,en;

    st.x=st_x;

    st.y=st_y;

    st.step=0;

    que.push(st);

    while(!que.empty()){

        st=que.front();

        que.pop();

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

            en.x=st.x+dir[i][0];

            en.y=st.y+dir[i][1];

            en.step=st.step+1;

            if(en.step>=ftime[en.x][en.y]||Map[en.x][en.y]=='#'||vis[en.x][en.y]==1)

                continue;

            if(en.x==0||en.x==R-1||en.y==0||en.y==C-1){

                printf("%d\n",en.step+1);

                return 1;

            }

            vis[en.x][en.y]=1;

            que.push(en);

        }

    }

    return 0;

}

int main()

{

    int cases;

    //freopen("in.txt","r",stdin);

    scanf("%d",&cases);
    while(cases--){

        while(!que.empty())

            que.pop();

        scanf("%d%d",&R,&C);

            getchar();

        node nd;

        for(int i=0;i<R;i++){

            for(int j=0;j<C;j++){

                scanf("%c",&Map[i][j]);

                if(Map[i][j]=='F'){

                    nd.x=i;

                    nd.y=j;

                    nd.step=0;

                    ftime[i][j]=0;

                    que.push(nd);

                }

                else if(Map[i][j]=='J'){

                    st_x=i;

                    st_y=j;

                }

            }

            getchar();

        }

        if(st_x==0||st_x==R-1||st_y==0||st_y==C-1){

            printf("1\n");

            continue;

        }

        bfs1();

        if(!bfs2())

            printf("IMPOSSIBLE\n");

    }

    return 0;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: