これは、迷路の最短経路を見つけることで、その差は、パスの出力を置くことです
アイデア:通常のBFSを書く、しかし、配列、レコードのポイント上の各点に参加する最後のポイントに到達した後、DFS上向きのパスを検索より
書式#include <iostreamの> の#include <キュー> 書式#include < 文字列の.h> 使用して名前空間はstdを、 typedefの長い長いLL。 typedefの符号なしの長い長いULL。int型迷路[ 5 ] [ 5 ]。 int型の D [ 5 ] [ 5 ]。 INT DX [ 4 ] = { - 1、1、0、0 }、DY [ 4 ] = { 0、0、 - 1、 1 }。 対 < INT、INT >最後[ 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()){ 対 < INT、INT > 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 ; 私は< 5。I ++ ) のための(INT J = 0 ; J < 5 ; J ++ ) 最後[I] [J] 1次回 =最後[I] [J] .second = - 1 。 BFS(0、0 ); リターン 0 ; }