K - 迷路

これは、迷路の最短経路を見つけることで、その差は、パスの出力を置くことです

アイデア:通常のBFSを書く、しかし、配列、レコードのポイント上の各点に参加する最後のポイントに到達した後、DFS上向きのパスを検索より

書式#include <iostreamの> 
の#include <キュー> 
書式#include < 文字列の.h> 使用して名前空間はstdを、
typedefの長い長いLL。
typedefの符号なしの長い長いULL。int型迷路[ 5 ] [ 5 ]。
int型の D [ 5 ] [ 5 ]。
INT DX [ 4 ] = { - 1100 }、DY [ 4 ] = { 00、 - 1

 
  

1 }。 < INTINT >最後[ 5 ] [ 5 ]。

ボイド DFS(int型のx、int型のY){
   場合(X || Y)
    DFS(最後の[X] [Y] 1次回、最後の[X] [Y] .second)。
  COUT << " " << X << " " << Y << " " << ENDL。
} ボイド BFS(int型のx、int型のY){ 
  キュー <ペア< INT
>> Q; 
  q.push(対 < 整数整数 > (X、Y)); 
  D [X] [Y] = 0 ; 


  一方、(!q.empty()){  < INTINT > T = q.front()。q.pop();
    もし(== t.first 4 && t.second == 4 ){ 
      DFS(最後[t.first] [t.second] 1次回、.second [t.first] [t.second]最後)。
      裁判所未満 << " " << << t.first " " << t.second << "endl;
      返します
    } 
    のためにint型 i = 0 ; iは< 4 ; I ++ ){
       int型 NX = t.first + DX [I]。
      INT NY = t.second + DY [I]。
      もし(NX> = 0 && NX < 5 && NY> = 0 && NY < 5 && D [NX] [NY] == - 1!&&迷路[NX] [NY] = 1 ){ 
        D [NX] [NY ] = D [t.first] [t.second] + 1 
        最後[NX] [NY] 1次回 = t.first。
        最後に[NX] [NY] .second= t.second。
        q.push(対 < 整数整数 > (NX、NY))。
      } 
    } 
  } 
} 

int型のmain(){ 
  IOS :: sync_with_stdio()。
  以下のためにint型 i = 0 ; iは< 5 I ++; のためのINT J = 0 ; J < 5 ; J ++ 
      CIN >> 迷路を[I] [J]。

  memsetの(D、 - 1はsizeofのD)。
  以下のためのint型I = 0 ; 私は< 5I ++ のためのINT J = 0 ; J < 5 ; J ++ 
      最後[I] [J] 1次回 =最後[I] [J] .second = - 1 

  BFS(00 ); 

  リターン 0 ; 
}

 

おすすめ

転載: www.cnblogs.com/ssNiper/p/11271846.html