CodeForces 1105D- 폭력 DFS

CodeForces 1105D Kilani 및 게임

주제 링크 : Kilani 및 게임에서

주제 효과 : 당신은 n 개의 * 분의지도를주고,지도 P-국가, 각 국가는 자신의 성,지도에서 디지털 디스플레이를 가지고, 각 국가는 바깥쪽으로 확장됩니다

그러나 각 확장에서 가장 확장 [나는] 단위, 라운드 각 국가 성 마지막 번호를 물어 교대로

주제 아이디어 : 그 바깥쪽으로 확장, 당신은 성을 각각 확장 BFS를 사용할 수있다 각 성의 가능성을 생각하지만,이 라인에 각 확장 성, 그래서 우리는 구조를 사용

X를 저장하려면, Y는, 단계는 단계 팽창은 여러 번이고, 각 국가마다 라운드 팽창 모서리이므로 BFS에 그 에지 위치를 저장하고, [] 필요성의 징조

그것

/ * 이 코드 Dev5.11에 경고이다 * /  
#INCLUDE <비트 / STDC ++ H.>
 은 USING  공간 STD는, 
타입 정의  ; LL
 CONST  INT MAXN = 1000 + 5. ;
 INT N-, m, P, VIS [MAXN [MAXN, ANS [MAXN 같이, S는 [MAXN]
 숯불 ; A [MAXN] MAXN]
 구조체 노드 
{ 
   INT의 X는, Y는, STEP; 
};  <노드> Boder [ 10 ], Q는,
 int로 디렉터리의 [를 4 ] [ 2 ] = { 1 , 0 - 1 , 0, 0 , 1 , 0 , - 1 };
무효 BFS ( INT 사람) 
{ 
    노드의 tmp; 
    INT의 X, Y;
    동안 (! q.empty ()) 
    { 
        TMP = q.front (); 
        q.pop (); 
        경우 (tmp.step의 == 0 ) boder [누가] .push (TMP);
        
        { 
             위해 ( int로 I = 0 ; i가 < 4 ; i가 ++ ) 
              { 
                  X = tmp.x DIR + [I] [ 0  ];
                  Y = + tmp.y 디렉터리 [I] . 1 ]
                   IF (X < . 1 || Y < . 1 ! || X> N- || Y> m || A [X] [Y] = ' . ' || ! VIS [X]는 [Y] = 0 ) 계속 ; 
                  VIS [X] [Y] = WHO; 
                  q.push (노드 {X, Y, tmp.step - 1. }); // 여기 표시 인큐 확장했다 단계에 필요한 -1; 
              } 
        } 
    } 
    반환 ; 
} 
BOOL 확장 ( INT WHO) 
{ 
     노드의 tmp를, 
     그동안 (!Boder [WHO] .empty ())  
     {
         TMP = Boder [WHO] .front ();    // 이러한 확장에 대한 공통 대기열 각 나라의 가장자리 
         Boder을 [WHO] .pop (); 
         tmp.step =에서 S [WHO]; 
         q.push (TMP) 
     }     
     BFS (); 
     반환 ! Boder [] .empty (); 
} 
INT 의 main () 
{ 
    는 scanf ( " %의 D %의 D %의의 D " , 및 N-, m, P)
     에 대한 ( INT I = 1. ; I <= P; I ++)는 scanf ( " %의 D " , S [I])
     에 대한 ( INT I = . 1 I <= N-; I는 ++)는 scanf ( "%의 S " , A [I] + 1이다. )
     에 대한 ( INT I = 1. ; I <= N-; I는 ++ ) 
    { 
         ( INT J = 1. , J <= m; J ++ ) 
        { 
            IF (A [I] [J ]> = ' 0 ' && A [I] [J] <= ' 0 ' + P) 
            { 
            INT NUM = A [I] [J] - ' 0 ' ; 
            Boder [NUM] .push (노드 {I, J, S [NUM]}) // 제 과정 각국 것 인큐 boder 
            VIS [I] [J] =  NUM;
            } 
        } 
    }
    
     그동안 ( 1. ) 
    { 
         BOOL OK = false로 ,
            대한 ( INT I = 1. 나는 <= P, 나는 ++ ) 
            OK | = 확장 (I);   // 국가의 각 라운드에 대한 열거 확장 결과,이 경우 라운드 한 나라의 확장, 그것은 긍정적 다음 확인, 다음 라운드가 
        IF (! OK) BREAK ;     
    } 
     에 대한 ( INT I = . 1 ; I <= N- I ++ )
         에 대한 ( INT J = 1. , J <= m ; J ++ ) 
            ANS [VIS [I] [J] ++;
     ( INT I =1 ; I <= P; 내가 ++ ) 
        의 printf ( " %의 D " , ANS [I]);
    반환  0 ; 
}

 

추천

출처www.cnblogs.com/tombraider-shadow/p/11220427.html