【BFS】姫を助けて!

タイトル説明

特定の王国の人々は、王女の悪い政府に対して革命を作ります。革命軍は、王女が住んでいる王宮に侵入しました。軍の兵士たちは、王女をキャッチするために宮殿を模索しています。あなたの仕事は、王女は、王宮から逃げたりすることができないことを決定するためのプログラムを書いています。

簡単にするために、宮殿の地面は、グリッドに分割矩形です。細胞の2種類がグリッドにあります:1は、兵士や姫が入ることができる細胞である、他の兵士や姫を入力することはできません細胞です。私たちは、かつての空のセル、後者の壁を呼び出します。姫と兵士たちは、初めに別の空のセルです。グリッドで唯一の脱出口があります。王女はハッチを到着した場合、その後、王女は宮殿から脱出することができます。宮殿よりもまたはゼロの兵士に等しいがあります。

王女とすべての兵士は、各単位時間で同時に行動を取ります。言い換えれば、姫と兵士たちは、他の人の次の行動を知らなくても、自分の行動を決定する必要があります。各単位時間に、姫と兵士は、水平方向または垂直方向に隣接するセルに移動することができ、又は現在のセルに滞在します。さらに、姫と兵士は、宮殿の地面の外に移動することはできません。王女と1つ以上の兵士が彼らの移動後に同じセル内に存在する場合、王女がキャッチされます。すべての兵士が宮殿から削除された場合の王女にのみ空のセルを経由してエスケープハッチに達することができることが保証されています。

兵士は兵士がどんな動きをする場合でも、王女をキャッチすることができないような王女のためのルートがある場合は、王女は兵士を脱出することができます。姫と兵士が同時にエスケープハッチを到着した場合、王女がキャッチされることに注意してください。王女は宮殿から脱出することはできますか?

 

エントリー

各データセットは、次の形式れます。

HW
MAP1
MAP2
...
MAPH
データセットの最初の行には、Hはグリッドの高さであり、Wは、グリッド(2≤H、W≤200)の幅である空間で区切ら2つの正の整数H及びWを含有します。

後続のH線のi番目の行は、宮殿の地面の状況を表す文字列MAPIを与えます。

MAPIは、長さWの文字列で、MAPIのj番目の文字は、i行j列のセルの状態を表しています。

「@」、「$」、「%」、「」、および『#』は、それぞれ、姫、兵士、エスケープハッチ、空のセル、および壁を表します。一つだけが存在することが保証されている「@」、唯一の「%」を、

 

輸出

出力単語を含む行は「はい」、王女は宮殿から脱出することができます。それ以外の場合は、出力「いいえ」。

 

サンプル入力

2〜4 
%@ $ 
... $$

サンプル出力

はい

 


 

 

[概要]

  その子は、操作が、兵士たちが最初に入れていること、そして行く王女を追加することを2つの火を入れ、その後、トップ%の王女で捕まえることができた兵士見てみたかったの前に。

  その後、試合後に私は私が間違ったトピックだということを知っています。

  トピックは、王女は%を見つけた前に兵士を見つけることができますを意味します。

[]問題を解決するには、
  %を使用することであり、兵士たちは、王女に来た多くの兵士がある場合は、その後、直接、最短時間の兵士が可能更新します。

  リバース思考、使用%がBFSました。最後に、我々は、対応する時間を比較することができます。

 

1つ の#pragma GCC最適化(2)
 2の#include <ビット/ STDC ++ H>
 3  使用して 名前空間STDを、
4  CONST  INT INF = 0x3f3f3f3f 5  のconst  int型 N = 205 ;
6  
7  INTの DIR [ 4 ] [ 2 ] = {
 8          { - 10 }、
 9      { 0、 - 1 }、{ 01 }、
 10          { 10 }
 11  }。
12  int型N、M。
13  チャーG [N] [N]。
14  INT VIS [N] [N]。
15のtypedef 構造体ノード{
 16      のint X、Y、ステップと
17      ノード(INT X = 0INT Y = 0 
18INTのステップ= 0 ):
 19               X(X)、Y(Y)、ステップ(工程){}
 20  }ノード。
21  int型NUM1、NUM2。
22キュー<ノード> Q;
23 ボイドBFS(){
 24  
25      ながら(!Q.empty()){
 26          ノードCUR = Q.front()。
27          Q.pop()。
28  
29          のためにint型 i = 0 ; iは< 4 ; iは++ ){
 30              INT TX = cur.x + DIR [I] [ 0 ]。
31              INT TY = cur.y + DIR [I] [ 1 ]。
32              であれば((!1 <= TX && TX <= N && 1 <= TY && TY <= M))続けます33              であれば(G [TX] [TY] == '' ){
 34                  続けます35              } そう であれば(G [TX] [TY] == ' @ ' ){
 36                  NUM1 = 分(NUM1、cur.step)。
37              } そう であれば(G [TX] [TY] == ' $ ' ){
 38                  NUM2 = 分(NUM2、cur.step)。
39              } そう であれば(G [TX] [TY] == ' ' && VIS [TX] [TY] == 0 ){
 40                 VIS [TX] [TY] = 1 41                  Q.push(ノード(TX、TY、cur.step + 1 ))。
42              }
 43           }
 44      }
 45      であれば(NUM1 < NUM2){
 46の          プット(" はいの\ n " );
47      } {
 48の          プット(" なしの\ n " );
49      }
 50      リターン51  }
 52  のint main()の
 53  {
 54     scanf関数(" %d個の%のD "、&​​N、&M)。
55      のためには、int型 i = 1 ; iが<= N; iが++ ){
 56          のscanf(" %sの"、G [I] + 1 )。
57      }
 58      int型のPX、PY。
59      のためには、int型 i = 1 ; iがn = <; iは++ ){
 60          のためのint型 J = 1 ; J <= Mであり、j ++ ){
 61              であれば(G [I] [J] == ' '){
 62                  PX = I、PY = J。
63              }
 64          }
 65      }
 66  
67  
68      NUM1 = NUM2 = INF。
69      Q.push(ノード(PX、PY、1 ))。
70      VIS [PX] [PY] = 1 71の     BFS()。
72  
73      戻り 0 ;
74 }
コードの表示

 

おすすめ

転載: www.cnblogs.com/Osea/p/11455779.html