zoukankan      html  css  js  c++  java
  • J

    题目链接

    题意:J代表Joe的位置,F代表火的起点,下一刻火将会向四周扩散,求Joe逃离的最短时间,如果不能逃离输出IMPOSSIBLE;

    注意火的起点可能不止一处

    可以用两次bfs分别求出人到达某个位置所用时间和火到达某个位置所用时间

      1 #include<iostream>
      2 #include<stdio.h>
      3 #include<string.h>
      4 #define INF 0xfffffff
      5 #include<queue>
      6 #include<algorithm>
      7 using namespace std;
      8 #define N 1010
      9 
     10 int dir[4][2]={ {1,0},{-1,0},{0,-1},{0,1} };
     11 char map[N][N];
     12 int people[N][N], fire[N][N];//分别代表人和火到达该位置的时间;
     13 int n, m, k, vis[N][N];
     14 struct node
     15 {
     16     int x,y;
     17 }f[N*N];//火的位置;可能不止一处;
     18 
     19 void FireBfs()
     20 {
     21     queue<node> Q;
     22     node p, q;
     23     memset(vis, 0, sizeof(vis));
     24     memset(fire, -1, sizeof(fire));
     25     for(int i=0; i<k; i++)
     26     {
     27         Q.push(f[i]);
     28         fire[f[i].x][f[i].y] = 1;
     29         vis[f[i].x][f[i].y]=1;
     30     }
     31     while(Q.size())
     32     {
     33         p = Q.front(); Q.pop();
     34         for(int i=0; i<4; i++)
     35         {
     36             q.x=p.x+dir[i][0];
     37             q.y=p.y+dir[i][1];
     38             if(q.x>=0 && q.y>=0 && q.x<n && q.y<m && vis[q.x][q.y]==0 && map[q.x][q.y]!='#')
     39             {
     40                 fire[q.x][q.y] = fire[p.x][p.y] + 1;
     41                 vis[q.x][q.y] = 1;
     42                 Q.push(q);
     43             }
     44         }
     45     }
     46 }
     47 int PeopleBfs(node s)
     48 {
     49     queue<node> Q;
     50     node p, q;
     51     memset(vis, 0, sizeof(vis));
     52     memset(people, -1, sizeof(people));
     53     Q.push(s);
     54     people[s.x][s.y] = 1;
     55     vis[s.x][s.y] = 1;
     56     while(Q.size())
     57     {
     58         p = Q.front(); Q.pop();
     59         if(p.x==0||p.x==n-1||p.y==0||p.y==m-1)
     60         {
     61             if((people[p.x][p.y] != -1 && people[p.x][p.y]<fire[p.x][p.y]) || (people[p.x][p.y] != -1&&fire[p.x][p.y] == -1) )//能到达边界并且在火到达之前;
     62                 return people[p.x][p.y];
     63         }
     64 
     65         for(int i=0; i<4; i++)
     66         {
     67             q.x = p.x + dir[i][0];
     68             q.y = p.y + dir[i][1];
     69             if(q.x>=0 && q.x<n && q.y>=0 && q.y<m && vis[q.x][q.y]==0 && map[q.x][q.y]!='#')
     70             {
     71                 people[q.x][q.y] = people[p.x][p.y] + 1;
     72                 vis[q.x][q.y] = 1;
     73                 Q.push(q);
     74             }
     75         }
     76     }
     77     return -1;
     78 }
     79 int main()
     80 {
     81     int T;
     82 
     83     scanf("%d", &T);
     84     while(T--)
     85     {
     86         node J;
     87         scanf("%d%d", &n, &m);
     88         k = 0;
     89         for(int i=0; i<n; i++)
     90         {
     91             scanf("%s", map[i]);
     92             for(int j=0; j<m; j++)
     93             {
     94                 if(map[i][j]=='J')
     95                     J.x = i, J.y = j;
     96                 if(map[i][j]=='F')
     97                     f[k].x = i,f[k++].y = j;
     98             }
     99         }
    100         FireBfs();
    101         int ans = PeopleBfs(J);
    102         if(ans==-1)
    103             printf("IMPOSSIBLE
    ");
    104         else
    105             printf("%d
    ", ans);
    106     }
    107     return 0;
    108 }
    View Code
  • 相关阅读:
    CSS3美化网页元素
    表单
    列表,表格与媒体元素
    HTML5基础
    双列集合map-1
    单列集合List
    kafka-Eagle的安装
    kafka-自定义拦截器(interceptor)
    kafka-Consumer API
    kafka-Producer API
  • 原文地址:https://www.cnblogs.com/zhengguiping--9876/p/4699976.html
Copyright © 2011-2022 走看看