総乗客ニンニクニンニク6月のホーム(条件付きBFS)

 

ニンニクの王は家に帰るが、彼の友人のココナッツフラワーガールの手の中に彼の家の鍵は、彼が最初のキーは、ブロッコリーの姉妹の手から家に行くために取得する必要があります。ブロッコリーの妹は彼に言った:「あなたは私の家の鍵が異なる場所で、それぞれの多くをコピーします。」

ニンニク6月には、できるだけ早く帰国することを望んで、彼は最初のいずれかのキーを取得する必要がある、あなたは彼が最も短い旅ホームの必要性を計算する助けを喜ばせるでしょう。

6月ニンニク都市生活は道路として、あなたがすることができます見ることができる道路の障壁、およびキーローカルホームを含め、m×n個のグリッドとして見ることができます。6月ニンニクは上下動市内の四の方向に沿って、カウントグリッドを移動するための一歩を踏み出すことができます。

入力形式

最初の行は二つの整数N、Mを有しています。シティマップは、n行m列です。(1≤n、m≤2000)

都市の地図を表すm個の文字の次のn行、。「#」は、道路を表し '障害物を表し、「SがT」ニンニク王は、位置を表し'ニンニク家族の位置を表すが、「P」がキーの位置を表します。障害物に加えて、他の場所ですることができます。(6月ニンニクのタイトルが確実に少なくとも一つのパスが成功の鍵を取得し、家に行くことができますがあります)

出力フォーマット

ステップの最小数のニンニク出力はラインごとに、家に帰ります。

サンプル入力

8  10 
P。####。#P#
..#..#...#
..#T ##。#。#
.......... 
.. ##。### ## 
.......... 
##### ... ## 
### ... S ##

 

サンプル出力

21

 

 

時間BFS状態がキーを行ったか否かを示すタグの多次元アレイを開きます。あなたは状態の最後に到達し、キーを取得した場合、BFSの最後のラベルが付いています。

私たちは同じポイントが実際には2回行くことができ、あるキーを取得するかどうかをマークに三次元VIS 3次元配列を開く必要がありますので、初めてのキーを取得する時ではない、第二には、キーを取得することです時間

 

 

1の#include <cstdioを>
 2の#include <キュー>
 3の#include <CStringの>
 4  使用して 名前空間をSTD。
5  
6  int型N、M。
7  チャーマット[ 2010 ] [ 2010 ]。
8  BOOL VIS [ 2010 ] [ 2010 ] [ 2 ]。
9  int型 DIR [ 4 ] [ 2 ] = { 10、 - 100、 - 101}。
10  
11  構造体ノード{
 12      のint X、Y、ステップ、OP。
13      ノード(){}
 14      ノード(INT _x、INT _y、INT _step、INT _op):X(_x)、Y(_y)、ステップ(_step)、OP(_op){} 
 15  } ST、キー。
16の 
17  空隙BFS(ノードU){
 18      キュー<ノード> Q。
19      q.push(U)。
20      VIS [UX] [UY] [ 0 ] = 1 ;
21      ながら(!{q.empty())
 22          = Fノードq.front()。
23          q.pop()。
24          のprintf(" =%D \ n X =%DY =%dはステップ=%d個のOP " 、FX、FY、f.step、f.op)。
25          であれば(マット[FX] [FY] == ' T ' && f.op){
 26              のprintf(" %dの" 、f.step)。
27              リターン;
28          }
 29          のためにINT iは= 0 ; iは< 4 ; I ++ ){
 30              INT NX = f.x + DIR [I] [ 0 ]。
31              INT NY = f.y + DIR [I] [ 1];
32              であれば(VIS [NX] [] [f.op] || NX < 0 ||がnx> = N || < 0 ||> = M ||マット[NX] [] == ' "続けます33              であれば(マット[NX] [] == ' P ' ){
 34                  q.push(ノード(NX、f.step + 11 ))。
35                  VIS [NX] [A] [ 1 ] = 1 36              }
 37              他の
38              {
 39                  q.push(ノード(NX、f.step + 1 、f.op))。
40                 VIS [NX] [NY] [f.op] = 1 41              }
 42          }
 43      }
 44  }
 45  
46  INT メイン(){
 47      のscanf(" %D%D "、&​​N、&M)。
48      のためにINT iが= 0 ; iが<N; I ++ ){
 49          のscanf(" %S " は、マットは、[I])。
50          のためにINT J = 0 ; J <M J ++ ){
 51              であれば(マット[I] [J] == ' S' ){
 52                  st.x = I。
53                  st.y = J。
54                  st.step = 0 55                  st.op = 0 56              }
 57          }
 58      }
 59の     BFS(ST)。
60      リターン 0 ;
61 }

 

 

-

おすすめ

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