MATL , 54 51 49 bayt
n:"G~1@(2Y6Z+leG45>1e*5M@)*]vtz:"otY*g]G48-X:*sX>
Giriş, ;
satır ayırıcı olarak MATL (AB) formatında bir 2D karakter dizisidir . Örnekteki ve test senaryolarındaki girdiler sırasıyla:
['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']
Çevrimiçi deneyin!
açıklama
Bu, "bağlanmak" ilişkisi ile tanımlanan grafiğin bitişik bir matrisini oluşturarak çalışır. Örnek olarak, 3 × 4 alanını düşünün
52-4
15-8
3-72
Bir 2D dizideki girişler (kolon-majör) doğrusal indeksleme kullanılarak MATL'de kolayca açıklanabilir. 3 × 4 durumunda, her girişin doğrusal endeksi şu şekilde verilir:
1 4 7 10
2 5 8 11
3 6 9 12
Bitişiklik matrisi, matris çarpımı kullanılarak adımlarla oluşturulur. İlk adımda, hemen komşuları ele alır. Örneğin, dizinlenmiş 3 noktası kendisinin ve dizin 2'nin komşusudur. 6'ya komşu değildir, çünkü bu nokta alana göre bir sayı içermez. Bu örnekte "yakın komşu" ilişkisinin bitişiklik matrisi, verilen 12 × 12 matris L'dir .
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
(Sütun 3'ün 1
satır 2 ve 3'te değeri olduğu görülebilir .) Bu matris her zaman simetriktir ve köşegen 1
içermeyen noktalar için değer taşır -
.
Bir sonraki adım " aradaki en fazla bir nokta ile bağlantılı" ilişkisinin bitişiklik matrisi olacaktır . Bunu elde etmek için, L'yi kendi başına çoğaltmak ve sıfır olmayan girişleri ayarlamak yeterlidir 1
. Genel olarak, " bir yolla bağlı" ilişkisinin bitişik matrisi , M , L' yi mümkün olan maksimum yol uzunluğunu temsil eden bir üsse (matris anlamda) yükselterek elde edilir . Maksimum yol uzunluğunun üst sınırı, L cinsinden sıfır olmayan girişlerin sayısıdır .
Matris gücünün doğrudan hesaplanması taşmaya neden olabilir, çünkü büyük sayılar hızla ortaya çıkar. Bu nedenle, aynı sayıda matrisle kademeli olarak çarpmak, büyük sayıların oluşmasını önlemek için her adımdan sonra sıfır olmayan girdileri 1'e dönüştürmek daha iyidir.
Sütun I ve M noktası ile (herhangi bir yol ile) bağlanır noktalarını temsil eden i . Şimdi, seviye alanı doğrusal sırayla bir sütun vektörü c'ye indirgenebilir , burada her giriş karşılık gelen sayıyı veya tanımlanmamış bir değeri içerir -
. Bu durumda Yani c olurdu
5
1
3
2
5
-
-
-
7
4
8
2
Her bir sütun Mutiplying M ile C öğeye ve her sütunun toplamını işlem her bir nokta için, verir i , alan noktasının toplam puan i aittir. Bir alan, birbirine bağlı tüm noktalar tarafından tanımlanır. Birçok sütunun aynı sonucu vereceğini unutmayın; yani, sütun i ve j noktaları, aynı miktar verecek i ve j, (aynı alana aittir) bağlanır. Nihai sonuç, bu meblağların maksimumu.
% 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