羅区P1649 [[USACO07OCT]障害物コース障害物コース]

タイトル説明

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 ] = { 10、 - 10 }。
INT NY [ 4 ] = { 0、 - 101 }。
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 ;
}

 

 

おすすめ

転載: www.cnblogs.com/iloveysm/p/12234724.html