zoukankan      html  css  js  c++  java
  • UVa 11624 Fire!

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

    分析:广搜,在加入Joe的起始位置之前,先把所有着火点加入队列。Joe只能到达没有障碍和火势控制的格子。

      1 #include <cstdio>
      2 #include <cstring>
      3 
      4 const int MAXN = 1004;
      5 const int dx[] = { -1, 1, 0, 0 };
      6 const int dy[] = { 0, 0, -1, 1 };
      7 
      8 struct point
      9 {
     10     int x, y;
     11     int minit;
     12     bool fir;
     13 };
     14 
     15 char map[MAXN][MAXN];
     16 bool vis[MAXN][MAXN];
     17 point Q[MAXN * MAXN];
     18 point start;
     19 point fire[MAXN * MAXN];
     20 int r, c;
     21 int cnt;
     22 
     23 bool check( int x, int y )
     24 {
     25     return  x > 0 && x <= r && y > 0 && y <= c ;
     26 }
     27 
     28 int BFS()
     29 {
     30     int front = 0, rear = 0;
     31 
     32     for ( int i = 0; i < cnt; ++i )
     33         Q[ rear++ ] = fire[i];
     34 
     35     Q[ rear++ ] = start;
     36 
     37     while ( front < rear )
     38     {
     39         point &tp = Q[front];
     40 
     41         if ( tp.fir )
     42         {
     43             for ( int i = 0; i < 4; ++i )
     44             {
     45                 int xx = tp.x + dx[i];
     46                 int yy = tp.y + dy[i];
     47                 if ( check(xx, yy) && ( !vis[xx][yy] ) )
     48                 {
     49                     vis[xx][yy] = true;
     50                     Q[rear].fir = true;
     51                     Q[rear].minit = tp.minit + 1;
     52                     Q[rear].x = xx;
     53                     Q[rear++].y = yy;
     54                 }
     55             }
     56         }
     57         else if ( map[ tp.x ][ tp.y ] == 'J' )
     58         {
     59             for ( int i = 0; i < 4; ++i )
     60             {
     61                 int xx = tp.x + dx[i];
     62                 int yy = tp.y + dy[i];
     63                 if ( !vis[xx][yy] )
     64                 {
     65                     vis[xx][yy] = true;
     66                     map[xx][yy] = 'J';
     67                     Q[rear].fir = false;
     68                     Q[rear].minit = tp.minit + 1;
     69                     Q[rear].x = xx;
     70                     Q[rear].y = yy;
     71                     if ( !check( xx, yy ) ) return Q[rear].minit;
     72                     ++rear;
     73                 }
     74             }
     75         }
     76 
     77             ++front;
     78     }
     79 
     80     return -1;
     81 }
     82 
     83 int main()
     84 {
     85     int T;
     86     scanf( "%d", &T );
     87     while ( T-- )
     88     {
     89         scanf( "%d%d", &r, &c );
     90 
     91         cnt = 0;
     92         memset( vis, false, sizeof(vis) );
     93         memset( map, '.', sizeof(map) );
     94 
     95         for ( int i = 1; i <= r; ++i )
     96         {
     97             getchar();
     98             for ( int j = 1; j <= c; ++j )
     99             {
    100                 map[i][j] = getchar();
    101                 switch( map[i][j] )
    102                 {
    103                 case 'J':
    104                     start.x = i;
    105                     start.y = j;
    106                     start.minit = 0;
    107                     start.fir = false;
    108                     vis[i][j] = true;
    109                     break;
    110 
    111                 case 'F':
    112                     vis[i][j] = true;
    113                     fire[cnt].x = i;
    114                     fire[cnt].y = j;
    115                     fire[cnt].fir = true;
    116                     fire[ cnt++ ].minit = 0;
    117                     break;
    118 
    119                 case '#':
    120                     vis[i][j] = true;
    121                     break;
    122                 }
    123             }
    124         }
    125         int ans = BFS();
    126         if ( ans == -1 ) puts("IMPOSSIBLE");
    127         else printf( "%d\n", ans );
    128     }
    129     return 0;
    130 }
  • 相关阅读:
    T-SQL:事务锁下的并发处理(十五)
    C# Quartz定时任务corn时间设置详解
    C# QuartZ使用实例写成服务
    SQL SERVER 一个SQL语句的执行顺序
    SQL SERVER 如何判断是不是年,月最后一天
    SQL SERVER 如何声明一个变量
    SQL SERVER GO命令循环使用实例
    T-SQL:批GO使用实例(十四)
    VS2017进程为idXXXX 无法启动解决方案
    UI5-文档-4.20-Aggregation Binding
  • 原文地址:https://www.cnblogs.com/GBRgbr/p/2803570.html
Copyright © 2011-2022 走看看