在一个迷宫里,'#'代表不能走的的墙,'.'代表可以走的广场,'J'代表人,'F'代表火,火每分钟能把其周围上下左右的四个地方给烧掉,凡是给烧掉的地方人就不能再走了,只要人能走到

迷宫的边界上就能传送出去,问人的逃出去的最小时间

因为传送出去还要一分钟,所以答案应该是人到达边界的时间在加上1,因为刚开始没有考虑着火的'F'有多个地方,所以wa了好久,先bfs火的情况,将火能到的每个点的最小时间记录

下来,然后bfs人的路径,如果人到达该点的时间小于之前记录的火到达该点的时间,则能走

至于着火的地方可能有多个,将多个点记录到队列里面同时bfs

 

  1 #include<cstdio>
  2 #include<queue>
  3 #include<cstring>
  4 using namespace std;
  5 #define M 1111
  6 #define inf 0x3f3f3f
  7 int vis[M][M],n,m,dis[M][M];
  8 char mp[M][M];
  9 struct point{
 10     int x,y;
 11     int time;
 12     point (int xx,int yy,int tt)
 13     {
 14         x=xx;
 15         y=yy;
 16         time=tt;
 17     }
 18 };
 19 struct node{
 20     int x,y;
 21     int time;
 22 };
 23 int dx[5]={-1,0,0,1};
 24 int dy[5]={0,-1,1,0};
 25 int x1,x2[M],y1,y2[M];
 26 queue<point>Q;
 27 void bfs1()
 28 {
 29    // printf("%d %d\n",dis[0][0],dis[0][1]);
 30     while (!Q.empty())
 31     {
 32         point now=Q.front();
 33         Q.pop();
 34         point next=now;
 35         for (int i=0;i<4;i++)
 36         {
 37             next.x=now.x+dx[i];
 38             next.y=now.y+dy[i];
 39             if (next.x<0||next.x>=n) continue;
 40             if (next.y<0||next.y>=m) continue;
 41             if (vis[next.x][next.y]) continue;
 42             if (mp[next.x][next.y]=='#') continue;
 43             vis[next.x][next.y]=1;
 44             next.time=now.time+1;
 45             if (dis[next.x][next.y]>next.time)
 46             dis[next.x][next.y]=next.time;
 47             Q.push(next);
 48         }
 49     }
 50     return ;
 51 }
 52 int bfs2()
 53 {
 54     queue<node>Q;
 55     memset(vis,0,sizeof(vis));
 56     node now,next;
 57     now.x=x1,now.y=y1;
 58     vis[x1][y1]=1;
 59     now.time=0;
 60     Q.push(now);
 61     while (!Q.empty())
 62     {
 63         now=Q.front();
 64         Q.pop();
 65         if (now.x==0||now.x==n-1||now.y==0||now.y==m-1)
 66             return now.time;
 67         for (int i=0;i<4;i++)
 68         {
 69             next.x=now.x+dx[i];
 70             next.y=now.y+dy[i];
 71             if (next.x<0||next.x>=n) continue;
 72             if (next.y<0||next.y>=m) continue;
 73             if (vis[next.x][next.y]) continue;
 74             if (mp[next.x][next.y]=='#') continue;
 75             next.time=now.time+1;
 76             if (next.time>=dis[next.x][next.y]) continue;
 77             vis[next.x][next.y]=1;
 78             Q.push(next);
 79         }
 80     }
 81     return -1;
 82 }
 83 int main()
 84 {
 85     int i,j,t;
 86     scanf("%d",&t);
 87     while (t--){
 88     scanf("%d %d",&n,&m);
 89     int flag1=0;
 90     while (!Q.empty()) Q.pop();
 91     memset(dis,inf,sizeof(dis));
 92     memset(vis,0,sizeof(vis));
 93     for (i=0;i<n;i++){
 94         for (j=0;j<m;j++){
 95             scanf(" %c",&mp[i][j]);
 96             if (mp[i][j]=='J') x1=i,y1=j,flag1=1;
 97             if (mp[i][j]=='F') {
 98                 point tem(i,j,0);
 99                 dis[i][j]=0;
100                 vis[i][j]=1;
101                 Q.push(tem);
102             }
103         }
104     }
105     if (!flag1){
106         printf("IMPOSSIBLE\n");
107         continue;
108     }
109     bfs1();
110     int x=bfs2();
111     if (x!=-1) printf("%d\n",x+1);
112     else printf("IMPOSSIBLE\n");
113     }
114     return 0;
115 }

 

posted on 2015-12-06 13:15  蜘蛛侦探  阅读(265)  评论(0编辑  收藏  举报