MATL , 54 51 49 byte
n:"G~1@(2Y6Z+leG45>1e*5M@)*]vtz:"otY*g]G48-X:*sX>
Đầu vào là một mảng char 2D ở định dạng MATL (AB), với ;
dấu phân cách hàng. Các đầu vào trong ví dụ và trong các trường hợp thử nghiệm tương ứng là:
['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']
Hãy thử trực tuyến!
Giải trình
Điều này hoạt động bằng cách xây dựng một ma trận kề của biểu đồ được xác định bởi mối quan hệ "đang được kết nối". Ví dụ: xem xét trường 3 × 4
52-4
15-8
3-72
Các mục trong một mảng 2D được mô tả dễ dàng trong MATL bằng cách sử dụng lập chỉ mục tuyến tính (cột chính). Trong trường hợp 3 × 4, chỉ số tuyến tính của mỗi mục được đưa ra là
1 4 7 10
2 5 8 11
3 6 9 12
Ma trận kề được xây dựng theo các bước sử dụng phép nhân ma trận. Trong bước đầu tiên, hàng xóm ngay lập tức được xem xét. Ví dụ: điểm được lập chỉ mục 3 là hàng xóm của chính nó và điểm đó với chỉ số 2. Nó không phải là hàng xóm của 6 vì điểm đó không chứa một số theo trường. Trong ví dụ này, ma trận kề của mối quan hệ "hàng xóm ngay lập tức" là ma trận 12 × 12 L được cho 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
(Có thể thấy rằng cột 3 có giá trị 1
ở hàng 2 và 3.) Ma trận này luôn đối xứng và đường chéo của nó có giá trị 1
cho các điểm không chứa -
.
Bước tiếp theo sẽ là ma trận kề của mối quan hệ "được kết nối với nhiều nhất một điểm ở giữa ". Để có được nó, nó đủ để nhân L với chính nó và đặt các mục nhập khác không 1
. Nói chung, ma trận kề của mối quan hệ "được kết nối bởi một số đường dẫn", M , có được bằng cách nâng L lên một số mũ (theo nghĩa ma trận) đại diện cho độ dài đường dẫn tối đa có thể. Một trên ràng buộc của chiều dài đường truyền tối đa là số khác không mục trong L .
Tính toán công suất ma trận trực tiếp có thể gây ra tràn, vì số lượng lớn nhanh chóng xảy ra. Vì vậy, tốt hơn là nhân dần theo cùng một ma trận, chuyển đổi các mục nhập khác thành 1 sau mỗi bước để ngăn chặn số lượng lớn xây dựng.
Cột i của M đại diện cho các điểm được kết nối (bằng bất kỳ đường dẫn nào) với điểm i . Bây giờ, trường mức có thể được giảm xuống thành một vectơ cột c theo thứ tự tuyến tính, trong đó mỗi mục chứa số tương ứng hoặc giá trị không xác định cho -
. Vì vậy, trong trường hợp này c sẽ là
5
1
3
2
5
-
-
-
7
4
8
2
Tương tự mỗi cột của M theo c phần tử khôn ngoan và tính tổng của mỗi cột cho, đối với mỗi điểm i , tổng số điểm của điểm khu vực i thuộc về. Một khu vực được xác định bởi tất cả các điểm được kết nối lẫn nhau. Lưu ý rằng nhiều cột sẽ cho kết quả tương tự; cụ thể, các cột i và j sẽ cho cùng một tổng nếu các điểm i và j được kết nối (thuộc cùng một khu vực). Kết quả cuối cùng là tối đa của những khoản tiền đó.
% 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