MATL、54 51 49バイト
n:"G~1@(2Y6Z+leG45>1e*5M@)*]vtz:"otY*g]G48-X:*sX>
入力はMATL(AB)形式の2D char配列で;
、行区切り記号として使用されます。例とテストケースの入力はそれぞれ次のとおりです。
['11-011123';'111-010--';'0010---01';'111-01234']
['1']
['1-1-1-1';'-1-1-1-';'2-1-1-1';'-1-1-1-']
['12-45-';'4-65-9';'87-654';'12-487';'45----';'684764']
['111-12';'------';'21--10']
オンラインでお試しください!
説明
これは、「接続されている」という関係によって定義されたグラフの隣接行列を構築することにより機能します。例として、3×4フィールドを考えます
52-4
15-8
3-72
2D配列のエントリは、(列優先)線形インデックスを使用してMATLで簡単に記述できます。3×4の場合、各エントリの線形インデックスは次のように与えられます
1 4 7 10
2 5 8 11
3 6 9 12
隣接行列は、行列乗算を使用して段階的に構築されます。最初のステップでは、すぐ隣の人が考慮されます。たとえば、3のインデックスが付けられたポイントは、それ自体とインデックス2のポイントの隣にあります。このポイントにはフィールドに応じた番号が含まれていないため、6の隣ではありません。この例では、関係「イミディエート-ネイバー」の隣接行列は次のように与えられる12×12行列Lです。
1 1 0 1 0 0 0 0 0 0 0 0
1 1 1 0 1 0 0 0 0 0 0 0
0 1 1 0 0 0 0 0 0 0 0 0
1 0 0 1 1 0 0 0 0 0 0 0
0 1 0 1 1 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 1 0 0 1
0 0 0 0 0 0 0 0 0 1 1 0
0 0 0 0 0 0 0 0 0 1 1 1
0 0 0 0 0 0 0 0 1 0 1 1
(列3の1
行2と3に値があることがわかります。)この行列は常に対称であり、その対角線にはを1
含まないポイントの値があります-
。
次のステップは、「最大で1つのポイントで接続された」関係の隣接行列です。これを取得するには、L自体を乗算し、非ゼロエントリをに設定するだけで十分1
です。一般に、「何らかのパスで接続されている」関係の隣接行列Mは、Lを可能な最大パス長を表す指数(行列の意味)に上げることで取得されます。最大パス長の上限は、Lの非ゼロエントリの数です。
行列の力を直接計算すると、大きな数がすぐに発生するため、オーバーフローが発生する可能性があります。したがって、同じ行列を徐々に乗算して、各ステップの後にゼロ以外のエントリを1に変換して、大きな数が蓄積しないようにすることをお勧めします。
列IのMは、点で(任意の経路によって)接続されている点を表す私は。これで、レベルフィールドを線形順序で列ベクトルcに縮小できます。各エントリには、対応する数値またはの未定義の値が含まれ-
ます。したがって、この場合、cは
5
1
3
2
5
-
-
-
7
4
8
2
各列Mutiplying Mをすることにより、Cの要素ごと、各列の和を計算する各点について、得られるI、領域点の合計スコアは、iが属します。エリアは、相互に接続されているすべてのポイントによって定義されます。多くの列で同じ結果が得られることに注意してください。つまり、ポイントiとjが(同じ領域に属する)接続されている場合、列iとjは同じ合計を返します。最終結果は、それらの合計の最大値です。
% Implicitly take input: 2D char array
n: % Range [1,...,N], where N is number of entries in the input
" % For loop. Each iteration builds a row of matrix L
G % Push input again
~ % Logical negate: transform into matrix of zeros
1 % Push 1, to be written into a matrix entry
@ % Iteration index. Ranges from 1 to N
( % Write that 1 into the N-th entry (linear order)
2Y6 % Push array [0 1 0; 1 1 1; 0 1 0]: mask of immediate neighbours
Z+ % Convolve and keep same-size result
le % Linearize into row array
G45> % Array of same size as the input that contains 1 for numbers, 0 for '-'
1e % Linearize into row array
* % Multiply element-wise
5M % Push last array again: 1 for numbers, 0 for '-'
@) % Get 0 or 1 value of that array corresponding to current iteration
* % Multiply. This is to give a row of zeros for non-numbers
] % End. We have all rows of L in the stack
v % Concatenate all rows into a matrix: L.
tz: % Duplicate. Range [1,...,K], where K is the number of nonzeros in L
" % For loop. Repear K times. This loop computes the 0/1 matrix power
o % Convert matrix entries to double
tY* % Duplicate and matrix-multiply
g % Convert to logical values, that is, nonzero values become 1
] % End. We have matrix M
G48- % Convert input chars to the corresponding numbers by subtractig 48
X: % Linearize into column array. This is vector c
* % Element-wise multiplication with broadcast (implicit repetition)
s % Sum of each column. Gives a row array
X> % Maximum of that row array
% Implicitly display