장 검색 기술 hdu1312 "빨간색과 검은 색"BFS "고급 항목에서 알고리즘 경쟁"

#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 ; 
 }

 

추천

출처www.cnblogs.com/chrysanthemum/p/11823037.html