容量2251
入力
入力は、ダンジョンの数から成ります。各ダンジョン説明は三つの整数L、R及びC(全てのサイズは30に限定されるもの)を含む行から始まります。
Lは、ダンジョンを構成するレベルの数です。
RおよびCは、各レベルの計画を構成する行と列の数です。
次いで、R線をそれぞれ含むCの文字のLブロックが続きます。各文字はダンジョンの一つのセルを説明しています。岩の完全なセルが「#」で示され、空のセルは、で表されます「」。あなたの開始位置は「S」と文字「E」によって、出口で示されています。各レベルの後に1つの空白行があります。入力はL、RとCのための3つのゼロで終了します
Lは、ダンジョンを構成するレベルの数です。
RおよびCは、各レベルの計画を構成する行と列の数です。
次いで、R線をそれぞれ含むCの文字のLブロックが続きます。各文字はダンジョンの一つのセルを説明しています。岩の完全なセルが「#」で示され、空のセルは、で表されます「」。あなたの開始位置は「S」と文字「E」によって、出口で示されています。各レベルの後に1つの空白行があります。入力はL、RとCのための3つのゼロで終了します
出力
それぞれの迷路は、出力の1行を生成します。それは出口に到達することが可能である場合は、フォームの行を印刷
ここで、xは、それが脱出するのにかかる最短時間で置き換えられます。
それは脱出することができない場合、ラインを印刷
x分(S)でエスケープされました。
ここで、xは、それが脱出するのにかかる最短時間で置き換えられます。
それは脱出することができない場合、ラインを印刷
閉じ込められました!
-------------------------------
それは、単純なBFSの問題ですが、初めに、私はそのBFSソリューションを見つけることができませんでした。(実際には、ために偽のカテゴリーの、私は、DFSの問題としてそれを間違え)。
我々は最短経路を検索するために、明らかにBFSは条件を満たしています。(BFSは、私たちがDFSを使用している場合、我々はルートが最短であるかを決定する前に、それはすべてのルートをトレースします、一歩各ラウンドを移動します)
この場合には、それは我々がクラスを使用する最初の時間です。ここで実際にクラスでは、我々が以前に使用し、構造体と異なる何もしています。それはグラフの抽象ポイントに対する良好な構造である。(ポイントX、Y、Z軸情報を有します)
クラス
ポイント
{
パブリック :
int型 X、Y、Z、数えます。
ポイント(){};
ポイント( INT TX、 INT TY、 INT TZ、 INT TCOUNT):X(TX)、Y(TY)、Z(TZ)、(TCOUNT)をカウント{}。
}。
{
パブリック :
int型 X、Y、Z、数えます。
ポイント(){};
ポイント( INT TX、 INT TY、 INT TZ、 INT TCOUNT):X(TX)、Y(TY)、Z(TZ)、(TCOUNT)をカウント{}。
}。
その後、我々はBFS、擬似コードを使用します。
しばらく(!queue.empty()){
ポイント<---デキュー
// 4 +2 = 6方向に向かって1つのステップ移動させます。
//ブロックが「E」
記録とリターン
//ブロックがされている場合「」
キューにブロックを入れてブロックを設定「#」
}
ここで重要なのは、パスの長さを記録したポイント構造の数、です。
コード
一方、
(
!
q.empty()){
ポイント点 = q.front()。
q.pop();
// 4つの方向の右前方、後方左 用(int型I = 0 ; iは< 4 ; I ++ ){ int型TX = point.x + dir_x [I]。INT TY = point.y + dir_y [I]。もし(迷路[point.z] [TX] [TY] == ' E ' ){ // 出口RES = point.count +
1 ;
返します 。
}
であれば (TX > 0 && TX <= R && TY > 0 && TY <= C && 迷路[point.z] [TX] [TY] == ' ' ){ // BFSは迷路[point.z] [ TX] [TY] = ' #' 。q.push(ポイント(TX、TY、point.z、point.count + 1 ))。} } // 上側場合(point.z > 1つの&& 迷路[ポイント。
- 1 ] [point.x] [point.y] == ' E ' ){ RES = point.count + 1 。返します。} であれば(point.z > 1つの&& 迷路[point.z - 1 ] [point.x] [point.y] == ' ' ){ 迷路[point.z - 1 ] [point.x] [ポイント。 Y] = ' #' 。q.push(ポイント(point.x、point.y、point.z - 1 、point.count + 1 ))。} //
下振れ 場合(point.z < L && 迷路[point.z + 1 ] [point.x] [point.y] == ' E ' ){ RES = point.count + 1 。返します。} であれば(point.z < L && 迷路[point.z + 1 ] [point.x] [point.y] == ' ' ){ 迷路[point.z + 1 ] [point.x] [ポイント。 Y] = ' #' 。
q.push(ポイント(point.x、point.y、point.z + 1 、point.count + 1 ))。} }
ポイント点 = q.front()。
q.pop();
// 4つの方向の右前方、後方左 用(int型I = 0 ; iは< 4 ; I ++ ){ int型TX = point.x + dir_x [I]。INT TY = point.y + dir_y [I]。もし(迷路[point.z] [TX] [TY] == ' E ' ){ // 出口RES = point.count +
1 ;
返します 。
}
であれば (TX > 0 && TX <= R && TY > 0 && TY <= C && 迷路[point.z] [TX] [TY] == ' ' ){ // BFSは迷路[point.z] [ TX] [TY] = ' #' 。q.push(ポイント(TX、TY、point.z、point.count + 1 ))。} } // 上側場合(point.z > 1つの&& 迷路[ポイント。
- 1 ] [point.x] [point.y] == ' E ' ){ RES = point.count + 1 。返します。} であれば(point.z > 1つの&& 迷路[point.z - 1 ] [point.x] [point.y] == ' ' ){ 迷路[point.z - 1 ] [point.x] [ポイント。 Y] = ' #' 。q.push(ポイント(point.x、point.y、point.z - 1 、point.count + 1 ))。} //
下振れ 場合(point.z < L && 迷路[point.z + 1 ] [point.x] [point.y] == ' E ' ){ RES = point.count + 1 。返します。} であれば(point.z < L && 迷路[point.z + 1 ] [point.x] [point.y] == ' ' ){ 迷路[point.z + 1 ] [point.x] [ポイント。 Y] = ' #' 。
q.push(ポイント(point.x、point.y、point.z + 1 、point.count + 1 ))。} }
-----------------------
その他
を使用しております
freopen("in.txt", "r", stdin);
freopen("out.txt", "w", stdout);
我々は、char迷路は、[] [] []のデータ構造として、迷路の情報を格納するのに使用します
迷路の入力は次のとおりです。
for (int i = 1; i<=L ; i++){
for (int j = 1; j<= R; j++) {
for(int k = 1; k<= C; k++){
cin>> maze[i][j][k];
if(maze[i][j][k] == 'S'){
startz = i;
startx = j;
starty = k;
}
}
}
}
ます。https://www.cnblogs.com/ggppwx/archive/2011/01/05/1925969.htmlで再現