2013年12月3日 星期二

[UVA] 11624 - Problem B: Fire!


#include<stdio.h>
#include<string.h>
#include<queue>
using namespace std;
char s[1005][1005];
int tag[1005][1005];
int v[1005][1005];
int d[4][2]={{1,0},{-1,0},{0,1},{0,-1}};
struct P{
    int x,y,c;
}in,out;
queue<P> que;
int main(){
    int t,i,n,m,j,x,y,flag;
    scanf("%d",&t);
    while(t--){
        while(que.size()) que.pop();
        memset(s,0,sizeof(s));
        memset(v,0,sizeof(v));
        scanf("%d%d",&n,&m);
        for(i=1;i<=n;i++){
            scanf("%s",&s[i][1]);
            for(j=1;j<=m;j++)
                tag[i][j]=99999999;
            for(j=1;j<=m;j++)
                if(s[i][j]=='F'){
                    x=i,y=j;
                    v[x][y]=1;
                    tag[x][y]=0;
                    que.push((P){x,y,0});
                }
        }
        while(que.size()){
            out=que.front();
            que.pop();
            for(i=0;i<4;i++){
                x=out.x+d[i][0];
                y=out.y+d[i][1];
                if(x>=1 && x<=n && y>=1 && y<=m && v[x][y]==0 && s[x][y]!='#'){
                    v[x][y]=1;
                    tag[x][y]=out.c+1;
                    in=out;
                    in.c++,in.x=x,in.y=y;
                    que.push(in);
                }
            }
        }
        flag=0;
        memset(v,0,sizeof(v));
        for(i=1;i<=n;i++)
            for(j=1;j<=m;j++)
                if(s[i][j]=='J')
                    x=i,y=j;
        v[x][y]=1;
        que.push((P){x,y,0});
        while(que.size()){
            out=que.front();
            que.pop();
            if(out.x==1 || out.x==n || out.y==1 || out.y==m){
                flag=1;
                break;
            }
            for(i=0;i<4;i++){
                x=out.x+d[i][0];
                y=out.y+d[i][1];
                if(x>=1 && x<=n && y>=1 && y<=m && v[x][y]==0 && s[x][y]!='#' && out.c+1<tag[x][y]){
                    v[x][y]=1;
                    in=out;
                    in.c++,in.x=x,in.y=y;
                    que.push(in);
                }
            }
        }
        if(flag) printf("%d\n",out.c+1);
        else puts("IMPOSSIBLE");
        /*for(i=1;i<=n;i++){
            for(j=1;j<=m;j++)
                printf("%d ",tag[i][j]);
            puts("");
        }*/
    }
}

沒有留言:

張貼留言