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 у лінійному порядку, де кожен запис містить відповідне число або невизначене значення для -
. Так що в цьому випадку 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