MATL , 54 51 49 байтов
n:"G~1@(2Y6Z+leG45>1e*5M@)*]vtz:"otY*g]G48-X:*sX>
Ввод - это двумерный массив символов в формате MATL (AB) с ;
разделителем строк. Входные данные в примере и в тестовых случаях соответственно:
['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
Записи в двумерном массиве легко описываются в 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
для точек, которые не содержат -
.
Следующим шагом будет матрица смежности отношения, «связанного не более чем с одной точкой между ними ». Чтобы получить его, достаточно умножить L на себя и установить ненулевые записи в 1
. В общем случае матрица смежности отношения «связана некоторым путем», M , получается путем возведения L в показатель степени (в матричном смысле), который представляет максимально возможную длину пути. Верхняя граница длины максимального пути является количество ненулевых элементов в L .
Непосредственное вычисление мощности матрицы может вызвать переполнение, потому что быстро появляются большие числа. Поэтому лучше постепенно умножать на одну и ту же матрицу, преобразовывая ненулевые записи в 1 после каждого шага, чтобы предотвратить накопление больших чисел.
Столбец i в M представляет точки, которые связаны (любым путем) с точкой i . Теперь поле уровня можно уменьшить до вектора столбца c в линейном порядке, где каждая запись содержит соответствующее число или неопределенное значение для -
. Так что в этом случае с будет
5
1
3
2
5
-
-
-
7
4
8
2
Умножение каждого столбца 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