UVA 11624

可能有多个着火点。

进行两次bfs。先将着火点预处理,记录地图中每个点被燃烧的最短时间,再让J开始走,每一步走的时间必须小于该点被燃烧的最短时间。

  1 #include <iostream>
  2 #include <cstdio>
  3 #include <cmath>
  4 #include <cstring>
  5 #include <algorithm>
  6 #include <queue>
  7 using namespace std;
  8 struct node
  9 {
 10     int x,y,step; 
 11 }s,f[1000];
 12 char a[1010][1010];
 13 int fir[1010][1010],vis[1010][1010],n,m,flag,k;
 14 int dir[4][2]={-1,0,1,0,0,-1,0,1};
 15 void bfs1()
 16 {
 17     node temp,next;
 18     queue<node>q;
 19     for(int i=0;i<k;i++)
 20     q.push(f[i]);
 21     while(!q.empty())
 22     {
 23         temp=q.front();
 24         q.pop();
 25         if(fir[temp.x][temp.y]>temp.step)
 26         fir[temp.x][temp.y]=temp.step;
 27         for(int i=0;i<4;i++)
 28         {
 29             next.x=temp.x+dir[i][0];
 30             next.y=temp.y+dir[i][1];
 31             next.step=temp.step+1;
 32             if(next.x>=0&&next.y>=0&&next.x<n&&next.y<m&&a[next.x][next.y]!='#'&&vis[next.x][next.y]==0)
 33             {
 34                 q.push(next);
 35                 vis[next.x][next.y]=1;
 36             }
 37             
 38         }
 39     }
 40 }
 41 void bfs()
 42 {
 43     node temp,next;
 44     queue<node>q;
 45     q.push(s);
 46     while(!q.empty())
 47     {
 48         temp=q.front();
 49         q.pop();
 50         for(int i=0;i<4;i++)
 51         {
 52             next.x=temp.x+dir[i][0];
 53             next.y=temp.y+dir[i][1];
 54             next.step=temp.step+1;
 55             if(next.x<0||next.y<0||next.x>=n||next.y>=m)
 56             {
 57                 printf("%d\n",next.step);
 58                 flag=1;
 59                 return;
 60             }
 61             if(a[next.x][next.y]!='#'&&vis[next.x][next.y]==0&&next.step<fir[next.x][next.y])
 62             {
 63                 q.push(next);
 64                 vis[next.x][next.y]=1;
 65             }
 66             
 67         }
 68     }
 69 }
 70 int main(int argc, char *argv[])
 71 {
 72     int t;
 73     scanf("%d",&t);
 74     while(t--)
 75     {
 76         scanf("%d%d",&n,&m);
 77         for(int i=0;i<n;i++)
 78         scanf("%s",a[i]);
 79         memset(fir,0x3f,sizeof(fir));
 80         memset(vis,0,sizeof(vis));
 81         k=0;
 82         for(int i=0;i<n;i++)
 83             for(int j=0;j<m;j++)
 84             {
 85                 if(a[i][j]=='J')
 86                 {
 87                     s.x=i;s.y=j;s.step=0;
 88                 }
 89                 if(a[i][j]=='F')
 90                 {
 91                     f[k].x=i;f[k].y=j;f[k].step=0;
 92                     vis[f[k].x][f[k].y]=1;k++;
 93                 }
 94             }
 95         
 96         
 97         bfs1();
 98         flag=0;
 99         memset(vis,0,sizeof(vis));
100         bfs();
101         if(!flag)
102         printf("IMPOSSIBLE\n");
103     }
104     return 0;
105 }

 

posted @ 2018-07-25 13:15  huluxin  阅读(157)  评论(0编辑  收藏  举报