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 ] = { 1、0 - 1、0、0、1、0、 - 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 ; }