[kuangbin带你飞]专题一 简单搜索 J UVA 11624

来源:互联网 发布:手卷钢琴软件 编辑:程序博客网 时间:2024/06/06 00:12

题目地址:https://vjudge.net/contest/65959#problem/J

思路:先将火在的位置入队保证火先走,人再走,这样就保证人走的位置一定没火。如果人走到了边界,bfs结束。有个坑就是火会有好多个地方有,而不是只有一团火。

AC代码:

#include<bits/stdc++.h>using namespace std;const int maxn=1000+10;char ma[maxn][maxn];int t,r,c;bool vis[maxn][maxn];bool vis1[maxn][maxn];int xx[4]={-1,0,1,0};int yy[4]={0,-1,0,1};struct pos{    int x,y,s,p;};pos J;int main(){    scanf("%d",&t);    while(t--)    {        scanf("%d%d",&r,&c);        memset(vis,false,sizeof(vis));        memset(vis1,false,sizeof(vis1));        for(int i=0;i<r;i++)        {            scanf("%s",ma[i]);            for(int j=0;j<c;j++)            {            if(ma[i][j]=='J')            {                J.x=i,J.y=j,J.s=0,J.p=1;                vis1[i][j]=true;            }            }        }        queue<pos>q;        for(int i=0;i<r;i++)            for(int j=0;j<c;j++)        {            if(ma[i][j]=='F')            {                vis[i][j]=true;                q.push(pos{i,j,0,0});            }        }      q.push(J);        int temp=0;        while(!q.empty())        {            pos now=q.front();            q.pop();           if(!now.p)//火           {               for(int i=0;i<4;i++)                {                    int tempx=now.x+xx[i];                    int tempy=now.y+yy[i];                    if(tempx>=0 && tempx<r &&tempy>=0 &&tempy<c)                        if(!vis[tempx][tempy] && ma[tempx][tempy]!='#')                    {                        vis[tempx][tempy]=true;                        q.push(pos{tempx,tempy,now.s+1,0});                    }                }           }           else           {               for(int i=0;i<4;i++)               {                    int tempx=now.x+xx[i];                    int tempy=now.y+yy[i];                   if(tempx<0 || tempx>=r || tempy<0 || tempy>=c)                   {                       temp=1;                       printf("%d\n",now.s+1);                       break;                   }                   if(!vis[tempx][tempy] && !vis1[tempx][tempy] && ma[tempx][tempy]!='#')                   {                       vis1[tempx][tempy]=true;                       q.push(pos{tempx,tempy,now.s+1,1});                   }                   if(temp)                    break;               }           }        }        if(!temp)            printf("IMPOSSIBLE\n");    }}


0 0