宿題のためSDNU 1220.Look(BFSパスタグ)

説明

(写真はちょうどemmm。画像を追加したいこのproblem..Iとは関係ありません。)
 
スーパー学者は、他のすべての宿題を奪います。モニタは宿題を取り戻すために学生を支援するために、スーパー学者で戦うことにしました。彼は邪魔されたくないので、しかし、スーパー学者は、お城に住んでいます。城の外には、2次元グリッドと迷路です。城を入力すると、迷路を渡す必要があります。モニターは、理由は彼のガールフレンドを伴うの時間を節約する必要があるので、彼はガールフレンドをしていない人、彼を助けるHuachao魏という名前の学生をしたいと考えています。今、彼は迷路のマップを持っており、最短経路を計算する必要があります。 

入力

入力は、それぞれの場合、2つの整数N、M(始まるいくつかのcases.Forから構成のみ0と1.本質であるためのスペースと値を持つM個含有maze.The次のn行の長さと幅を象徴します) 0を渡すことができ、1は渡すことはできません。今、あなたは(1,1)の場所にあるトップに参照のうえには.Eachのステップは、左右、上下に歩くことができる(M、N)の代わりに、あるcorner.the輸出を残しました。

出力

各場合について、最初の行には、左、下、right.ifアップ表すcastle.The第二のラインプリントがU、D、L、R用の文字をk個到着するステップの最小数を印刷多くのパスが同じです最小dictionary.It城に到着するパスをそこに持っている必要があることを保証しているとの長さは、パスを印刷してください。

サンプル入力

3 3 
001 
100 
110 
3 3 
000 
000 
000

サンプル出力

4 
RDRD 
4 
DDRR

ソース

道の
考える:どのような魔法のタイトルトラックああ。データを直接int型を使用することはできません読み込み;約時に着手し、八尾アントピック辞書順最小出力が言ったので、区別行くことがあります下に、左、右、タイトルを遵守するために行くことを向けます要件。
書式#include <cstdioを> 
する#include <iostreamの> 
の#include <cmath> 
の#include < 文字列 > 
の#include <CStringの> 
の#include <アルゴリズム> 
書式#include <キュー> 
の#include <ベクトル> 
の#include <マップ>
 使用して 名前空間はstd;
#defineっ長い長いint型 N、M、位置[ 18 ] [ 18 ]。
INTの経路[ 4 ] [ 2 ] = { 100、 - 10

1、 - 10 }。
構造体ノード
{ 
    int型X、Y。
}。

構造体のエッジ
{ 
    int型の X、Y、S = 0 チャーステップと 
} E [ 100 + 8 ] [ 100 + 8 ]。

ボイドBFS()
{ 
    キュー <ノード> Q。
    ノードp。
    PX = 0 ; 
    PY = 0 ; 
    ポジション[ 0 ] [ 0 ] = 1; 
    q.push(P)。
    一方、(!q.empty())
    { 
        ノードL = q.front()。
        q.pop(); 
        もし(LX == N- 1 && LY == M- 1のリターン;
        以下のためにint型 i = 0 ; iは< 4 ; iは++ 
        { 
            ノードwを、
            WX = l.x +パス[I] [ 0 ]。
            WY = l.y +パス[I] [ 1 ]。
            もし(WX> = 0 &&ワイオミング州> = 0!WX && <&& N-WY <M && ポジション[WX] [WY])
            { 
                位置[WX] [WY] = 1 ; 
                E [WX] [WY] .S = E [LX] [LYは] + .S 1。; 
                E [WX] [WY] .X = LX; // 点の点上のレコード、点によって確認されるように 
                E [WX] [WY] .Y = LY; // 地点の地点レコードに、一点が識別されるので、
                IF(I == 0)E [WX] [WY]。ステップ= ' D ' ;
                  IF(I == 1)E [WX] [WY]。ステップ= ' L ' ;
                 他の IF(I == 2)E [WX] [WY]。ステップ= ' R ' そう であれば(I == 3)E [WX] [WY]。ステップ= ' U ' 
                q.push(W)。
            } 
        } 
    } 
} 

ボイドプリント(INT A、INT B)
{ 
    場合(== 0 && Bの== 0のリターン; 
    プリント(E [A] [B] .X、E [A] [B] .Y)。
    printf(" %のC " 、E [A] [B]。ステップ)。
} 

int型)(主 
{
    一方、(〜のscanf(" %D%dの"、&​​N、&M))
    { 
        チャー S [ 18 ] [ 18 ]。
        int型 iは= 0 ; iがN <; I ++)はscanf関数(" %sの" 、S [I])。
        int型 iは= 0 ; iがN <I ++ のためのINT J = 0 ; J <Mであり、j ++ 
            { 
                もし、(S [I] [J] == ' 0 ')の位置は、[I] [J] = 0;
                他の位置[i] [j]は= 1 ; 
            } 
        BFS()。
        printf(" %d個の\ n "、E [N- 1 ] [M- 1 ] .S)。
        プリント(N - 1、M- 1 )。
        printf(" \ nを" ); 
    } 
    戻り 0 
}

 

おすすめ

転載: www.cnblogs.com/RootVount/p/10991679.html