CodeForces 1105D-暴力DFS

CodeForces 1105D Kilani氏とゲーム

トピックへのリンク:Kilani氏とゲームで

トピックの効果は:あなたのn×m個のマップを与えるために、マップ上のp-国が、それぞれの国が独自の城、マップ上のデジタルディスプレイを持って、それぞれの国が外側に拡大していきます

しかし、それぞれの拡張で最も拡張[私]は単位は、ラウンドはそれぞれの国の城の最後の番号を尋ねる交代します

トピックのアイデアは:その外側に拡張を持っている、あなたは各拡張城がライン上にあり、城のそれぞれを拡大するBFSを使用することができますが、それぞれの城の可能性を考えるので、私たちは、構造体を使用します

Xを保存するために、yは、ステップは、ステップの展開は、いくつかの回を表す、各国各ラウンドは、膨張の縁からのものであるので、BFSに、エッジ上の位置を保存し、そしてする[]必要のボーデ

それは

/ * このコードはDev5.11に警告である* /  
の#include <ビット/ STDC ++ H.>
 使用して 名前空間STD; 
typedefの長い ロングLL、
 CONST  INT MAXN =  + 5。 INT N-、M、P、VIS [MAXN ] [MAXN]、ANS [MAXN]、Sは[MAXN];
 char型; [MAXN] [MAXN]
 構造体ノード
{ 
   int型のX、Y、工程; 
}; 
キュー <ノード> Boder [ 10 ]、Q;
 INT DIR [ 4 ] [ 2 ] = { 10 - 10010、 - 1 }。
ボイド BFS(INT WHO)
{ 
    ノード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 DIR [I] [ 1 ];
                   IF(X < 1 || Y < 1!|| X> N- || Y> M || [X] [Y] = ' ' || !VIS [X] [Y] = 0続行; 
                  VIS [X] [Y] = ; 
                  q.push(ノード{X、Y、tmp.step - 1 }); // ここで示さエンキューが拡大しており、ステップ必要-1;               } 
        } 
    } リターン; 
} BOOL展開(INT WHO)
{ 
     ノードTMPを、一方(!

    

      Boder [] .emptyを())
     { 
         TMP = Boder [] .front();    // このような拡張する共通キューとして各国の縁
         Boder [] .popを(); 
         tmp.step = S []。
         q.push(TMP); 
     }     
     BFS(WHO); 
     戻り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([I] [J ]> = ' 0 ' && [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 ;
            のためにint型 I = 1 ; I <= p型を、私は++ 
            [OK]を | =拡大(I);   //は、この中にターンがある場合は、ラウンド各国の展開結果を列挙します状態の拡張は、陽性であることが[OK]を、次のラウンドがある
        IF(!OK)BREAK ;     
    } 
     ためINT I = 1 ; I <= N; I ++ のためのINT J = 1。 ; J <= M; J ++ 
            ANS [VIS [I] [J]] ++ I =;
    INT1 ; I <= P、iは++ 
        のprintf(" %dの" 、ANS [I])。
    リターン 0 ; 
}

 

おすすめ

転載: www.cnblogs.com/tombraider-shadow/p/11220427.html