BFS - 赤と黒

A - 赤と黒

 

1つの#include <ビット/ STDC ++ H.>
 2  使用して  名前空間STD;
 3  CONST  INT MAXN = 25 ;
 4  int型 N-; INT M;
 5  int型の X; INT Y; INT ANS;
 6  チャー S [MAXN] [MAXN]; / / 入力迷路
7。 int型のああ[MAXN] [MAXN]; // ああアレイフラグが渡されると、0が代表を通じて、来なかった
8。 構造体ノード{
 9。     int型の X; INT Y;
 10  } ST;
 11  INT movede [ 4] [ 2 ] = {{ 10 }、{ - 10 }、{ 01 }、{ 0 - 1 }}; // モバイル代わっ
12は BOOL OK(int型の FX、INT FY){ // [OK]配列は、そうでない場合はfalseに、それがtrueを返した場合に離れて行くことができる点で表され、
13である     のiF(<FX 。1 || FX> <M || FY 。1 ||年度> N-)復帰 はfalse ; // この判断は、これはポイントは迷路の外にあるかどうかを決定するために使用される 
 14  //     (== [FY] S [FX]「@」)そうでない場合はFALSEに戻る; //は、この決意を点が開始点であるかどうかを決定するために使用されます。 
15  //     falseに他IF(S [FX] [FY] == '#')のリターン; // この決意は、点が障害であるかどうかを決定するために使用される;
 16      // 上記の二つを決定することができる
。17       IF(S [ !FX]、[FY] = ' 'の戻りをfalseに18である// ;代わりに。19 他のIF(S [FX] [FY] == ' ' && AH [FX] [FY] == 1。 リターンfalseに// [FY] [FX]ああ、この決意を介してポイントかどうかを決定するために使用されている = 1 を介して代わっ20はのiF(S [FX] [FY] == ' ' && AH [FX] [FY] = = 0      
       
      リターン trueに ; // AH [FX FY]スルー[0] =平均ない
21である }
 22である ボイド BFS(){ // 関数検索
23は、      AH [st.x] [st.y] = 1 ; 
 24      キュー<ノード> Q; //は、キューQを作成し、
25      q.push(ST); // このキューQに出発点
26      ながら(!のq.empty()){ // キューが空であるQならば、それはない表します次にアウトループの、移動するための方法
27          ANS ++ ;
 28          ノードq.front = T(); // キューポイントの最初の行を記録
29          q.pop(); // キュー内の最初のポイントを投げる
30          ノードnewNode ;// 次の点に行くことができる記録
31である         ためINT Iは= 0 ; I < 4。 ; I ++){ // 次の点に行くことができる見つける
32              INT FX + movede T. X = [I] [ 0 ];
 33のIS              INT FY = t.y movede + [I] [ 1 ];
 34は、             IF(OK(FX、FY)){ // OKを返すtrueの場合、代表的には、この時点で行くことができます。FX、FYなりnewNode 
35                  newnode.x = FX;
 36                  newnode.y = FY;
 37 [                  AH [FX]は[FY] = 1 ;
 38である                  q.push(newNode); // 次に、キューQのnewNodeに入れで
39              }
 40          }
 41れる     }
 42れる }
 43は、 INT (メイン){
 44は     、一方(scanfの(" %Dの%のD "、およびN-、&M)=!EOF){
 45          IF(N - == 0 && M == 0BREAK ;
 46のIS          memsetの(ああ、0はsizeof AH); // メイクああ配列検索を開始、全て0さ
47          のためINT I = 1 ; I <= M; I ++ ){
 48              scanfの(" %のS "、[I] + S 1); // により1から環状開始する入力迷路、そうS [i]は入力1を追加するときにその; 
49          }
 50          のためにINT I = 1 ; I <= M; I ++) { // 開始点を見つけるために使用される
51である             ためINT J = 1。 ; J <= N; J ++ ){
 52は、                 IF(S [I] [J] == ' @ ' ){
 53は                      st.x = I; st.y J =; BREAK ; // サイクルの開始時点ことを見つける; 
54である                 }
 55              }
 56れる         }
 57は、          ANS = 0; // ANS行くための代表者の数。ここでそれらの初期化の次のセットを検索するには、0に等しい
58の          BFS(); // 幅優先探索は、探索番号に行くことができる
59          のprintf(" %D \ N- " ;、ANS)
 60      }
 61です }

この質問は、イタリアはという部屋にあります。「@」に黒のタイルの上に立っている人は、彼は4枚の隣接するタイルの1つに移動することができます。しかし、彼は唯一の赤瓦「#」に移動することはできません。「」黒いタイルの上に移動します。私たちは、彼が行くことができますレンガの最大数を求めてみましょう。

この質問はで使用されているBFS(BFS) グラフトラバーサル、黒のタイルを見つけるために行くことができます。「」数。

この質問は、このような練習BFS作るためのテンプレートとして使用することができます。

おすすめ

転載: www.cnblogs.com/kitalekita/p/12215993.html