トウワタ侵食(BFS)

 

armerジョンはジューシー、健康な草の彼の芝生が一杯にしようとしてきました。残念ながら、その日の1は喜んでいないから、彼は人間対植物で敗北しました。彼の農場の北西部分ですでにトウワタ悪が足場を占領しました。

いつものように草を、高さY(1 <= Y <= 100)に分割され、デカルトグリッドのX幅尾部(1 <= X <= 100)。(1,1)(Xの一般的な構成、同一のY座標と座標)グリッドの左下隅です。トウワタは最初のグリッド(MX、マイ)を占めていました。毎週、すべての方向に石があまりなく、すべてのグリッドへのトウワタスプレッドは(垂直方向と水平方向に隣接し、隣接する斜め格子を含む)トウワタグリッドを占領されています。1週間後、これらの新しい細胞の職業とはトウワタ顔よりゲリーに広がることができます。

ベッシーは草が完全にトウワタを占領される前に、可能な限りすべての草を楽しみたいです。最後にトウワタ彼女はそれが全体の芝生を占有するのにかかるどのくらい興味がありました。グリッド(MX、MY)に時間ゼロでトウワタ場合、まだその瞬間に彼らは完全に(常に起こるのだろう与えられたデータのために)それを占有草の全体部分に侵入することができますか?

草は、絵で表現されます。。「」草を示し、「*」岩を示しています。この例X = 4、例えば3 Y =。

....

.. *。

。**。

左下隅(最初の行、列1)で始まるトウワタ場合は、次のような状況に発展する草をマップします。

 

 

 トウワタ全体の土地は4週間後に占有されます。

 

エントリー

*最初の行:X、Y、MX、マイ:4つの整数は、スペースで区切られた
* 2ラインY + 1を介して:「」X文字(示さ草によって最初データ列Y + 1」セクションで説明*「を意味ボルダー)、(Y + 2-y)の行草。

輸出

 単一の整数は、先週の数は、大きな石の格子がトウワタを占領されていません表します。

サンプル入力

4  3  1  1 
... 
.. * **。

サンプル出力

4 

 

なお、一般的な検索の数とランクのような同じ、変換ルックではありません

1の#include <stdio.hの>
 2の#include < ストリング・H>
 3の#include <iostreamの>
 4の#include < ストリング >
 5の#include <math.h>の
 6の#include <アルゴリズム>
 7の#include <ベクトル>
 8#含む<スタック>
 9の#include <キュー>
 10の#include < セット >
 11の#include <地図>
 12の#include <sstream提供さ>
 13  のconst  int型 INF = 0x3f3f3f3f 14 typedefの長い 長いLL。
 使用して 名前空間はstdを、
16  
17  整数N、M、SX、SY。
18  構造体ノード
 19  {
 20      のint X、Y。
21      INT ステップと
22      ノード(){}
 23      ノード(INT _x、INT _y、INT _step){X = _x。Y = _y。ステップ= _step;}
 24  }。
25  チャー G [ 105 ] [ 105 ]。
26  INT VIS [ 101 ] [ 101 ]。
27  INT NT [ 8] [ 2 ] = {{ - 10 }、{ - 11 }、{ 01 }、{ 11 }、{ 10 }、{ 1、 - 1 }、{ 0、 - 1 }、{ - 1、 - 1 }}。 
28の 
29  ボイドBFS()
 30  {
 31      のmemset(VIS、0はsizeof (VIS))。
32      キュー<ノード> QE。
33      VIS [SX] [SY] = 1;
34      qe.push(ノード(SX、SY、0 ));
35      INT ANS = - 1 36      ながら(!qe.empty())
 37      {
 38          ノードT。
39          T = qe.front()。
40          qe.pop()。
41          のためにINT iは= 0 ; iは< 8 ; I ++ 42          {
 43              INT XX = t.x + NT [I] [ 0 ]。
44              INT YY = t.y + NT [I] [ 1 ]。
45              もし(XX>0 && XX <= N && YY> 0 && YY <= M &&!VIS [XX] [YY] && G [XX] [YY] == ' ' 46              {
 47                  qe.push(ノード(XX、YY、t.step + 1 ))。
48                  VIS [XX] [YY] = 1 49の                  ANS = MAX(ANS、t.step + 1)。// 更新答案
50              }
 51          }
 52      }
 53      のprintf(" %dの\ n " 、ANS)。
54  }
 55  
56  のint main()の
 57 {    
 58      scanfの(" %D%D%D%D "、&​​M、およびN-、およびSY、&SX); // 入力クリック位置を変更
59      SX = N - SX + 1 ; // 変更した場合SX 
60      のためにINT I = 。1 ; I <= N; I ++ 61れる          scanfの(" %のS " 、G [I]);
 62である     BFS();
 63である     
64      リターン 0 ;
 65 }

 

 

 

 

 

 

 

 

 

-

おすすめ

転載: www.cnblogs.com/jiamian/p/12181730.html