ACMアルゴリズムの練習1月3日BFS

容量2251

入力

入力は、ダンジョンの数から成ります。各ダンジョン説明は三つの整数L、R及びC(全てのサイズは30に限定されるもの)を含む行から始まります。 
Lは、ダンジョンを構成するレベルの数です。 
RおよびCは、各レベルの計画を構成する行と列の数です。 
次いで、R線をそれぞれ含むCの文字のLブロックが続きます。各文字はダンジョンの一つのセルを説明しています。岩の完全なセルが「#」で示され、空のセルは、で表されます「」。あなたの開始位置は「S」と文字「E」によって、出口で示されています。各レベルの後に1つの空白行があります。入力はL、RとCのための3つのゼロで終了します

出力

それぞれの迷路は、出力の1行を生成します。それは出口に到達することが可能である場合は、フォームの行を印刷 
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)をカウント{}。
}。

 

その後、我々は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 ))。} }

 

-----------------------

その他 

を使用しております 

  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で再現

おすすめ

転載: blog.csdn.net/weixin_34414196/article/details/93871308