1105D- насилие Codeforces ДФС

1105D Килани Codeforces и игры

Тема ссылка: Килань и при игре

Тема эффект: дать вам карту н * м, р-страна на карте, каждая страна имеет свой собственный замок, цифровой дисплей на карте, каждая страна будет расширяться наружу

Но самое с расширением в каждом расширении [я] единицы, туры по очереди прошу каждую страну замок последнего номер

Тема идеи: подумайте о возможности каждого замка имеет свое внешнее расширение, вы можете использовать BFS расширить каждый из замка, но каждый расширительный замок там на линии, поэтому мы используем структуру

Для сохранения х, у, шаг, шаг расширение также представляет несколько раз, и каждую страну в каждом раунде есть от края расширения, поэтому необходимо Бод [которые], чтобы сохранить место на крае, а затем на BFS

это

/ * Этот код является предупреждением о Dev5.11 * /  
#include <бит / STDC H. ++>
 с использованием  имен STD; 
ЬурейеЕ Long  Long LL;
 Const  INT MAXN = 1000 + 5. ,
 ИНТ п, м, Р, VIS [MAXN ] [MAXN], АНС [MAXN], S [MAXN];
 обугливается А [MAXN] [MAXN];
 структура узла 
{ 
   INT X, Y ШАГ; 
}; 
Очередь <Узел> Boder [ 10 ], Q,
 Int в DIR [ 4 ] [ 2 ] = { 1 , 0 - 1 , 0, 0 , 1 , 0 , - 1 };
недействительный BFS ( INT кто) 
{ 
    узел TMP; 
    ИНТ х, у;
    в то время как (! q.empty ()) 
    { 
        TMP = q.front (); 
        q.pop (); 
        если (tmp.step == 0 ) Boder [который] .С (TMP);
        иначе 
        { 
             для ( INT I = 0 ; г < 4 ; я ++ ) 
              { 
                  х = tmp.x + DIR [I] [ 0 ]; 
                  у = + tmp.y Устройство DIR [I] , [ . 1 ];
                   ЕСЛИ (Х < . 1 || У < . 1 ! || Х> п || У> т || А [Х] [Y] = ' ' || ! VIS [X] [Y] = 0 ) Продолжить ; 
                  VIS [X] [Y] = ВОЗ; 
                  q.push (Node {X, Y, tmp.step - 1. }); // Епдиеие представленные здесь расширился, шаг необходим -1;               } 
        } 
    } возвращение ; 
} BOOL расширяемой ( INT ВОЗ) 
{ 
     Node TMP; это время (!

    

      Боудер [ВОЗ] .empty ()) 
     {
         TMP = Boder [ВОЗ] .front ();    // края каждой страны , такие как общая очередь , чтобы расширить 
         Боудер [ВОЗ] .pop (); 
         tmp.step = S [ВОЗ]; 
         q.push (TMP); 
     }     
     BFS (ВОЗ); 
     вернуться ! Боудера [ВОЗ] .empty (); 
} 
Int основной () 
{ 
    Scanf ( " % D% D% D " , & н-, & м, & Р);
     для ( INT I = 1. , я <= Р; я ++) Scanf ( " % D " , & S [I]);
     для ( INT I = 1.; I <= п, я ++) Scanf ( " % S " , А [I] + 1. );
     Для ( INT I = 1. , Я <= п, я ++ ) 
    { 
        для ( INT J = 1. , J <= т; j ++ ) 
        { 
            ЕСЛИ (А [I] , [J] , > = ' 0 ' && А [I] , [J] <= ' 0 ' + Р) 
            { 
            INT NUM = А [I] , [J] - ' 0 ' ; 
            Boder [ NUM] .С (Узел {I, J, S [NUM]}); // первый процесс, каждая страна будет Enqueue Boder 
            VIS [I] , [Дж] = NUM; 
            } 
        } 
    }
    
     Это время ( 1. ) 
    { 
         BOOL OK = ложь ;
            для ( INT I = 1. , I <= P; I ++ ) 
            OK | = расширяемой (I);   // Результаты расширения перечислений для каждого раунда страны, если это круглый расширение одна страна, то нормально она положительна, то следующий раунд 
        IF (ок!) BREAK ;     
    } 
     для ( INT I = 1. , I <= п; I ++ )
         для ( INT J = 1. , J <= т ; j ++ ) 
            АНС [VIS [I] , [J]] ++;
    для ( INT  I =1 ; я <= р; я ++ ) 
        Е ( " % D " , анс [I]);
    вернуться  0 ; 
}

 

рекомендация

отwww.cnblogs.com/tombraider-shadow/p/11220427.html