#INCLUDE <iostream>
#INCLUDE <cstdio>
#INCLUDE <큐>
은 USING 스페이스 STD를,
숯 실 [ 25 ] [ 25 ]
INT 디렉터리를 [ . 4 ] [ 2 ] = {{- . 1 , 0 } { 0 - . 1 }, { 1. , 0 } { 0 , 1이다. }};
INT WX, 하이록, NUM의;
// WX, 하이록의 : 길이 테두리의 폭 NUM : 타일의 초기 총 개수에서 타일 도달
#DEFINE에게 (X 수표 , Y) (X <&& WX의 X> Y = 0 &&> = 0 && Y <숨바꼭질)
// 여부 확인 경계
구조체 노드
{
INT의 X, Y;
};
보이드 BFS ( INT의 DX, INT DY)
{
큐 <노드> Q;
노드 다음, 시작;
start.x = DX;
start.y = DY;
q.push (시작); // 把当前节点入队
동안 (! q.empty ())
{
시작 = q.front ();
() q.pop;
위한 ( INT 난 = 0 ; I < 4 ; ++ I)
{
next.x = start.x DIR + [I] 0 ];
next.y = + 디렉터리를 start.y [I] [ 1. ]
IF 합니다 (CHECK (next.x, next.y) && 룸 [next.x] next.y] == ' . ' )
{
룸 [다음. X는 [next.y] = ' # ' ; // 현재 노드에서 태그 간
NUM을 ++; // 단계 증분의 숫자
; q.push (NEXT) // 자식 노드 인큐
}
}
}
}
INT 메인 ()
{
INT X, Y, DX, Dy를;
// DX, Dy가 인간 스테이션
그동안 WX의 (CIN >> 숨바꼭질)
{
경우 (WX == 0 && 하이록 == 0 )
{
체류 ;
}
에 대한이 (Y는 = 0 ++; Y <하이록 y)를
{
위한 (X = 0 , X <WX; ++ X)
{
CIN >> 방 [X] [Y];
경우 (실 [X] [Y] == ' @ ' )
{
DX = X;
DY = Y;
}
}
}
NUM =1 ;
BFS (DX, DY);
COUT << NUM << ENDL;
}
반환 0 ;
}