uva11624

题目名称:Fire!

题目链接:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=2671


题意:joe在一个迷宫里,有地方着火,火的蔓延方向是上下左右,每次一格,joe可以走的方向也是上下左右,每次一格,问joe能否走出这个迷宫,可以输出最短的走出时间,‘ # ‘ 表示墙,’ F ‘ 表示火,’ . '  表示可走


思路:bfs,不过有点麻烦,,然后还有点坑,也许是他的内部输入数据有些后面多了个空格什么的,,用getchar(),一直wa,调试了一天,以为是主程序哪里错了==,,,还要注意得先把火扔进队列


代码如下:

#include<cstdio>
#include<iostream>
#include<cstring>
#include<string>
#include<algorithm>
#include<vector>
#include<queue>
using namespace std;
char a[1005][1005];
int Jx,Jy;
bool vis[1005][1005];      //记录是否走过
int dir[4][2]={1,0,-1,0,0,1,0,-1};
int ok;      //记录最短步数
int R,C;
struct Node
{
    int x,y;
    int sum;
    bool fire;      //判断是否为火
}que[1001*1001];
int bfs()
{
    int frot=0,rear=0;
    memset(vis,false,sizeof(vis));
    for(int i=0;i<R;i++)
        for(int j=0;j<C;j++)
            if(a[i][j]=='F')       //火的数目可能有多个
            {
                que[rear].x=i;
                que[rear].y=j;
                que[rear].sum=0;
                que[rear].fire=true;
                rear++;
            }
    que[rear].x=Jx;
    que[rear].y=Jy;
    que[rear].sum=0;
    que[rear].fire=false;
    rear++;
    while(frot<rear)
    {
        int xx=que[frot].x;
        int yy=que[frot].y;
        for(int i=0;i<4;i++)
        {
            int xx=que[frot].x+dir[i][0];
            int yy=que[frot].y+dir[i][1];
            if(que[frot].fire)    //火
            {
                if(xx<0||yy>=C||yy<0||xx>=R||a[xx][yy]=='#'||a[xx][yy]=='F')
                    continue;
                a[xx][yy]='F';
                que[rear].x=xx;
                que[rear].y=yy;
                que[rear].sum=que[frot].sum+1;
                que[rear].fire=true;
                rear++;
            }
            else     //人
            {
                if(vis[xx][yy]||a[xx][yy]=='#'||a[xx][yy]=='F')
                    continue;
                if(xx<0||yy<0||xx>=R||yy>=C)
                    return que[frot].sum+1;
                vis[xx][yy]=true;
                que[rear].x=xx;
                que[rear].y=yy;
                que[rear].sum=que[frot].sum+1;
                que[rear].fire=false;
                rear++;
            }  
        }
        frot++;

    }
    return 0;
}
int main()
{
    int t;
    scanf("%d",&t);
        while(t--)
        {
            scanf("%d%d",&R,&C);
            memset(vis,0,sizeof(vis));
            Jx=Jy=-1;
            for(int i=0; i<R; i++)
            {
                scanf("%s", a[i]);
                if(Jx == -1)
                    for(int j=0; j<C; j++)
                        if(a[i][j] == 'J')
                        {
                            Jx = i;
                            Jy = j;
                            break;
                        }
            }
            /*
            getchar();           //就是这样写,,一直wa
            for(int i=0; i<R; i++)
            {
                for(int j=0; j<C; j++)
                {
                    scanf("%c", &a[i][j]);
                        if(a[i][j] == 'J')
                        {
                            Jx = i;
                            Jy = j;
                        }
                }
                getchar();
            }
            */
            ok=bfs();
            if(ok)
                printf("%d\n",ok);
            else
                printf("IMPOSSIBLE\n");
        }
    return 0;
}




posted @ 2015-07-25 11:01  maplefighting  阅读(182)  评论(0编辑  收藏  举报