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