タイトル説明
1からなるN(1 <= N <= 100)正方形フィールドをX Nを検討
1枚のタイルによります。これらのタイルの一部は牛によってimpassibleで、ナビゲートするために挑戦され、この5によってフィールドに「X」が付いています:
. . B x .
. x x A .
. . . x .
. x . . .
. . x . .
ベッシーは、位置Aに1つのそのような分野で自分自身を見つけ、そこ塩ブロックをなめるために、位置Bに移動したいです。牛のようにゆっくりと、製材生き物がオンにすると、当然のことながら、唯一の正方形のフィールドの端に平行に移動することが好きではありません。所与のフィールドのために、ベッシーは、任意の方向に向けて開始および終了することができるB.ザパスにAから任意のパスに90度ターンの最小数を決定します。ベッシーは彼女が塩なめるに取得することができます知っています。
グリッド内のN * N(1 <= N <= 100)、 'X' 表す格子が歩くことができない、 '' 格子は、歩くことができ表します。カルメン脂肪、したがって、悪いターン。今、点Aから点Bに移動し、少なくとも90度曲げを数回オンにする必要がありますか?
入力形式
整数Nの最初の行は、N個の文字の次のNラインは、文字のみが表示されます「」、 『X』、 『A』、 『B』、各文字がした後、上述マトリックス上記グリッドを示しますスペース。
[データ]スケール
2 <= N <= 100
出力フォーマット
整数:ターンの最小数。そうでない場合は、-1の出力に達します。
タイトル分析:一般的なBFSは図の最短経路(層の内線番号)で実行したときに記録されたポイントを検索し、この質問はスタックから最小出力周波数と、私たちは細根スタックにおける模倣ダイクストラ+ヒープ最適化保存されたターン数は、その後、ダイクストラ実行されることができターンを必要とし、トップは常に最小であるので、我々はBFSの答えに行くことができるようになったとき
#include <ビット/ STDC ++ H> 使用して 名前空間STDを、 char型 [ 109 ] [ 109 ]。 int型ブック[ 109 ] [ 109 ]。 INTフラグ= 99999 。 int型 NX [ 4 ] = { 1、0、 - 1、0 }。 INT NY [ 4 ] = { 0、 - 1、0、1 }。 int型S1、S2; int型E1、E2; 構造体のノード { あなたは = PX 0 ; あなたは = PY 0を。 あなたのx = 0 ; あなたのy = 0 ; あなたワット= 0 ; フレンドブール 演算子 <(ノードA、ノードB)// 小根堆 { 戻り AW> BW。 } }。 int型wは、 PRIORITY_QUEUE <ノード> Q。 整数M、N。 空 BFS()// ダイクストラ { ノードのための; fir.x = S1; fir.y = S2。 q.push(FIR)。 本[S1] [S2] = 1 。 しばらく(!q.empty()) { 今ノード = q.top()。 q.pop(); 本【now.x] [now.y] = 1 。 もし(now.x == E1 && now.y == E2) { // IF(now.w <=フラグ) { フラグ = now.w。 休憩; // 戻り値; } } 以下のために(INT iが= 0 ; I < 4 ; I ++ ) { INT TX = now.x + NX [I]。 INT TY = now.y + NY [I]。 もし(TX < 1 || TX> M || TY < 1 || TY> m)を 続けます。 もし([TX] [TY] == ' X ' ) 続けます。 もし(ブック[TX] [TY] == 1 ) 続けます。 もし((TX-now.x)*(now.x-now.px)+(TY-now.y)*(now.y-now.py)== 0 ) { 次のノード。 next.x = TX; next.y = TY; next.px = now.x。 next.py = now.y。 next.w = now.w + 1 。 (次の)q.push。 } そうしないと { 次のノード。 next.x = TX; next.y = TY; next.px = now.x。 next.py = now.y。 next.w = now.w。 (次の)q.push。 } } } } int型のmain() { cinを >> メートル。 memsetの( - 1、はsizeof ())。 INT X、Y。 int型Z; 以下のために(INT iは= 1 ; I <= M; I ++ ) のための(INT J = 1 ; J <= Mであり、j ++ ) { char型のC; cinを >> C。 もし(C == ' A ' ) { S1 = I; S2 = J; } もし(C == ' B ' ) { E1 = I; E2 = J; } [I] [J] = C。 } BFS(); もし(フラグ== 99999 ) COUT << - 1 。 他の coutの << フラグ。 リターン 0 ; }