件名の説明:
BHは迷路が行列で、彼は脱出したい、迷路にあります!
入力:
入力は複数のテストケースから構成されています。各場合について、最初の行は2つの整数N、M(1 <= N、M <= 100)を含みます。
以下のNラインの各々は、Mの文字が含まれています。各文字は、マップの細胞を意味します。
ここでchracterの定義があります。 :マップ内の文字については「S」:BHの開始場所、マップ内の一つだけ。「E」:目標セル、マップ内の一つだけ。'':空のセル。'#':障害物セル。'A':加速ルーン。
BH彼が加速ルーンを得る加速rune.Whenせずに2秒を要した一歩を移動するだけで1つのsecond.Theバフがかかり、各step.Itに(右、上、下、左)4つの方向に移動することができ、5秒間継続し、時間あなたが別の加速ルーンを取得するときに累積しない。(いつBHでの手段が加速ルーンを取得することを、バフ時間が5秒になります)。
出力:
彼は、印刷できない場合は、最小時間BHは、目標セルに到達「してくださいヘルプBHを!」。
理解します:
全体的に、このゲームはHHH最短を再生するのではなく、加速するかどうかを判断することである、最もちょうど、通常のキューを行い、その後、開始から最短経路(距離)のすべてのポイントにレコードを2次元配列で開始したいですしかし、複数の要素を有する構造であっバフ加速度は、各時間を食べるかどうかを決定する場合(que.front()バフ> 0)temp.buff = que.front()バフ-1;が、後ため同じ点は、そこに別のパスであってもよく、短い外観、困難なトレードオフと最短マークバフを有していてもよいです。
このようにデータを処理するための優先キューと非常に奇妙なダニエルは、(あなたが最短同じポイントを更新できるように)最短経路を記録するためにステップ構造を使用して、この問題の核心である最も興味深い場所でリマインダー、 〜。。同じ点が異なる経路を有することができるので、パスは異なるパスであろういくつかのバフを持っているかもしれない、いくつかは(また、バフがおおよそ通常パスを拾う、バフをピックアップするために単一の点として理解することができません最短は?私はマークされていない場合、我々はマークアップしなければならないので、同じポイントが表示されます異なる値を記録する3-VISエネルギーで)。このニーズがあることを考えると、キューに圧入しました。
コードは以下の通りであります:
1の#include <ビット/ STDC ++ H> 2 使用して 名前空間STDを、 3 CONST INT MAXN = 105 。 4 CONST INT INF = 0x3f3f3f3f 。 5 BOOL VIS [MAXN] [MAXN] [ 10 ]。 6 INTの方法[ 4 ] [ 2 ] = {{ 0、1 }、{ 0、 - 1 }、{ 1、0 }、{ - 1、0 }}。 7 INT 分。 8 構造体ノード{ 9 int型のX、Y、ステップ、バフ。 10 友人ブール 演算子 <(CONSTノードA、CONST ノードB) 11 { 12 であれば(a.step == b.step) 戻り a.buff < b.buff。 13 リターン a.step> b.step。 14 } 15 }。 16 PRIORITY_QUEUE <ノード> QUE。 17 整数N、M、SX、SY、EX、EY。 18 チャーA [MAXN] [MAXN]。 19の ボイドBFS(){ 20 第一次のノードTEMP、、。 21 VIS [SX] [SY] [ 0 ] = 真。 22 first.x = SX、first.y = SY、first.step = 0、first.buff = 0 。 23 que.push(最初の); 24 ながら(!que.empty()){ 25 TEMP = que.top()。 26 que.pop()。 27 であれば(temp.x == EX && temp.y == EY){ 28 分= 分(分、temp.step)。 29 ブレーク; 30 } 31 他 32 { 33 のために(INT iは= 0 ; I < 4 ; I ++ ) 34 { 35 INT DX = temp.x +方法[i]が[ 0 ]。 36 INT DY = temp.y +方法[I] [ 1 ]。 37 であれば(DX < 0 || DX> = N || DY < 0 || DY> = M || A [DX] [DY] == ' #') 続けます。 38 であれば(temp.buff> 0 ){ 39 next.buff = temp.buff - 1 。 40 next.step = temp.step + 1 。 41 } 他{ 42 next.buff = 0 。 43 next.step = temp.step + 2 。 44 } 45 であれば([DX] [DY] == ' A ' ) 46 next.buff = 5 。 47 であれば(VIS [DX] [DY] [next.buff]) 48が 続け。 49 VIS [DX] [DY] [next.buff] = 真; 50 next.x = DX、next.y = DY。 51 que.push(次) 52 } 53 } 54 } 55 リターン。 56 } 57 58 のint main()の 59 { 60 ながら(CIN >> N >> M){ 61 分= INF。 62 のmemset(VIS、偽、はsizeof (VIS)); 63 のmemset(0、はsizeof (a)参照)。 64 中(!que.empty())que.pop(); 65 のための(INTは私= 0 ; I <N I ++ ) 66 のための(INT J = 0 ; J <Mであり、j ++ ) 67 CIN >> [I] [j]を。 68 のために(INTは iは= 0 ; I <N I ++ ) 69 のための(INT J = 0 ; J <Mであり、j ++ ){ 70の 場合([I] [J] == ' S ' ) 71 SX = I、 SY = J; 72 他の 場合([I] [J] == ' E ' ) 73 EX = I、EY = J。 74 } 75 BFS()。 76 もし(分== INF) 77 はcout << " !助けてくださいBH " << " \ rを\ n個" ; 78 他の 79 coutの<<分<< " \ rを\ n個" ; 80 } 81 リターン 0 。 82 }