MATL , 54 51 49 바이트
n:"G~1@(2Y6Z+leG45>1e*5M@)*]vtz:"otY*g]G48-X:*sX>
입력은 ;
행 구분자로 사용 되는 MATL (AB) 형식의 2D 문자 배열입니다 . 예제 및 테스트 케이스의 입력은 각각 다음과 같습니다.
['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
포함하지 않는 점에 대한 값 을 갖습니다 -
.
다음 단계는 " 사이에있는 최대 한 지점 과 연결된"관계의 인접 행렬입니다 . 이를 얻으려면 L 에 자체 를 곱하고 0이 아닌 항목을로 설정하면 1
됩니다. 일반적으로, " 일부 경로에 의해 연결된"관계 M 의 인접 행렬은 L 을 최대 가능한 경로 길이를 나타내는 지수 (매트릭 의미로) 로 증가시킴으로써 얻어진다 . 최대 경로 길이의 상한은 L 의 0이 아닌 항목 수입니다 .
많은 수의 빨리 발생하기 때문에 매트릭스 전력을 직접 계산하면 오버플로가 발생할 수 있습니다. 따라서 동일한 행렬을 점진적으로 곱하여 각 단계 후에 0이 아닌 항목을 1로 변환하여 많은 수의 누적을 방지하는 것이 좋습니다.
M의 열 i 는 (어떤 경로로든) 점 i 와 연결된 점을 나타냅니다 . 이제 레벨 필드 를 선형 순서 로 열 벡터 c 로 줄일 수 있습니다 . 여기서 각 항목에는에 해당하는 숫자 또는 정의되지 않은 값이 포함됩니다 . 따라서이 경우 c 는-
5
1
3
2
5
-
-
-
7
4
8
2
각 열 Mutiplying M을 하여 C의 요소 와이즈 각 열의 합을 계산하면, 각 점에 대해, 제공 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