道双方向BFSを探すHDU2612

URL:https://vjudge.net/problem/HDU-2612

質問の意味:

分布マップは、いくつかのKCFは(?)、マップ上の出発点で、2人がいる「#」、彼らがグリッドを歩くことができない、「」表現は、見に行くことができます「@」生き先を表しています。支払うために価格を移動開始点から二人は、$ 1 $で、コストと最小値を求め、互いの出発点を渡すことはできません。

ソリューション:

二人の男は、その後、列挙BFS最小に走った後の図が組み込まれています。

ACコード:

書式#include <iostreamの> 
の#include <キュー> 
の#include <CStringの> 
名前空間stdを使用。
int型のDEP1 [40005]、DEP2 [40005]; 
チャーCH [205] [205]。
DIR INT [4] [2] = {{0,1}、{1,0}、{0、-1}、{ - 1,0}}。
INTのN、M、L、B。
int型のres [40005]; 
BOOLチェック(int型のx、int型のY、チャーS)
{ 
	(x> = N || X <0 || Y> = M || Y <0)の場合は
		falseを返します。
	IF(CH [X] [Y] == '#' || CH [X] [Y] == S)
		falseを返します。	
	trueを返します。	
} 
ボイドプリント(INT * DEP)
{ 
	(I = 0 int型、iがN <; ++ i)が用
	{ 
		ため(INT J = 0; J <M; ++ j)は
			COUT << DEP [iがM * + J ] <<」「; 
		coutの<<てendl;	
	} 
} 
無効BFS(int型の、
	キュー<整数> QUE。
	DEP [S] = 1。
	que.push(S); 
	(!que.empty())、一方
	{ 
		INT T = que.front()。
		que.pop(); 
		// coutの<< "T =" <<トン<<てendl; 
		INT X = T / M、Yは、T%mを=。
		// COUT << X <<」「<< Y << ENDL。
		(++ iは; iが4 <I 0 = INT)のために
		{ 
			IF(チェック(X + DIR [I] [0]、Y + DIR [I] [1]、K))
				(DEP [(X +ならDIR [I] [0])* M + Y + DIR [I] [1]] == 0)
				{ 
					// COUT <<(X + DIRを[I] [0])* M <<」「<< Y + DIR [I] [1] << ENDL。
					DEP [(X + DIR [i]が[0])* M + Y + DIR [I] [1] = DEP [T] +1。
					que.push((X + DIR [i]が[0])* M + Y + DIR [I] [1])。
					//印刷(DEP)。
					// coutの<<てendl; 
				} 
		}	 
	} 
	// COUT << ENDL。
}  
ボイド()を解きます
{ 
	INT ANS = 0x3f3f3f3f。
	以下のために(; iはi = 0 int型<Lを、++ I)
		IF(DEP1 [RES [I]] && DEP2 [RES [I]] && ANS> DEP1 [RES [I] + DEP2 [RES [I])
			ANS = DEP1 [RES [I] + DEP2 [RES [I]]。
	COUT <<(ANS-2)* 11 << ENDL。		
} 
int型のmain()
{ 
	一方(CIN >> N >> M)
	{ 
		memsetの(CH、0、はsizeof(CH))。
		memset(dep1,0、はsizeof(DEP1))。
		memset(dep2,0、はsizeof(DEP2))。
		L = 0。
		(; iがN <++ iが0 = INT)のため
			のために(INT J = 0; J <M; ++ j)は
			{ 
				CIN >> CH [I] [J]。	
				(CH [I] [J] == 'Y')もし
					= iが+ M * J。
				そうであれば(CH [I] [J] == 'M')
					B = iがjで+ M *。
				他の(CH [I] [J] ==もし'@' 
					) RES [L ++] = iはJ *を+ M。	
			}
		/ *(; iがN <++ I I = 0をINT)のための
		{ 
			(INT J = 0であり、j <M; ++ j)のための
				COUT << CH [I] [J] <<」「。
			coutの<<てendl;	
		} 
		COUT << L << " "<< <<" "<< B <<"" << ENDL。
		(; iがLに<++ iはi = 0の整数)のための
			COUT << RES [I] << ENDL; * / 
		BFS(DEP1、 'M')。
		BFS(B、DEP2、 'Y'); 
		解決する(); 
	} 
	0を返します。
}

 

おすすめ

転載: www.cnblogs.com/Aya-Uchida/p/11300671.html