UVA 11624 Fire!

bfs。。
曾经1A。。
现在写。。
居然wa10发。。
居然是输入的时候行和列搞反了,找了1h居然没找到!!
今天无状态。。
每次重写似乎有可能会发生奇妙的事情啊。。

#include<stdio.h>
#include<queue>
#include<string.h>
using namespace std;
int r,c;
char map[1010][1010];
int wayfire[1010][1010];
int wayme[1010][1010];
int cin;
struct node
{
    int x;
    int y;
}J,F[10100];
queue<node>Q;
int move[4][2]={{1,0},{0,1},{-1,0},{0,-1}};
void bfs()
{
    memset(wayfire,0x3f3f3f3f,sizeof(wayfire));
    for(int i=0;i<cin;i++)
    {
        wayfire[F[i].x][F[i].y]=0;
        Q.push(F[i]);
    }
    while(!Q.empty())
    {
        node old=Q.front();
        Q.pop();
        node new1;
        for(int i=0;i<4;i++)
        {
            new1.x=old.x+move[i][0];
            new1.y=old.y+move[i][1];
            if(new1.x>=0&&new1.x<r&&new1.y>=0&&new1.y<c&&wayfire[new1.x][new1.y]==0x3f3f3f3f&&map[new1.x][new1.y]!='#')
            {
                wayfire[new1.x][new1.y]=wayfire[old.x][old.y]+1;
                Q.push(new1);
            }
        }
    }
}
int bfs1(node x)
{
    memset(wayme,0x3f3f3f3f,sizeof(wayme));
    wayme[x.x][x.y]=1;
    if(x.x==r-1||x.x==0||x.y==0||x.y==c-1)
        return wayme[x.x][x.y];
    Q.push(x);
    while(!Q.empty())
    {
        node old=Q.front();
        Q.pop();
        node new1;
        for(int i=0;i<4;i++)
        {
            new1.x=old.x+move[i][0];
            new1.y=old.y+move[i][1];
            if(new1.x>=0&&new1.x<r&&new1.y>=0&&new1.y<c&&wayme[new1.x][new1.y]==0x3f3f3f3f&&map[new1.x][new1.y]=='.'&&wayme[old.x][old.y]+1<=wayfire[new1.x][new1.y])
            {
                wayme[new1.x][new1.y]=wayme[old.x][old.y]+1;
                if(new1.x==r-1||new1.x==0||new1.y==0||new1.y==c-1)
                    return wayme[new1.x][new1.y];
                Q.push(new1);
            }
        }
    }
    return 0x3f3f3f3f;
}

int main()
{
    int T;
    scanf("%d",&T);
    while(T--)
    {
        int i,j;
        scanf("%d%d",&r,&c);
        cin=0;
        for(i=0;i<r;i++)
        {
            scanf("%s",map[i]);
            for(j=0;j<c;j++)
            {
                if(map[i][j]=='J')
                {
                    J.x=i;
                    J.y=j;
                }
                if(map[i][j]=='F')
                {
                    F[cin].x=i;
                    F[cin].y=j;
                    cin++;
                }
            }
        }
        bfs();
        int ans=bfs1(J);
        if(ans==0x3f3f3f3f)
             printf("IMPOSSIBLE\n");
        else
            printf("%d\n",ans);
        while(!Q.empty())
            Q.pop();
    }
    return 0;
}

你可能感兴趣的:(uva,bfs)