Dyalog APL, 27 znaków
⊃⌽∨.∧⍨⍣≡1≥+/¨|∘.-⍨,(~×⍳∘⍴)⎕
⎕oceniane dane wejściowe. APL rozróżnia macierz od wektora wektorów. Ten program zakłada, że wejście jest macierzą.
(~×⍳∘⍴)Ajest widelcem równoważnym (~A) × ⍳⍴A. Konieczne jest uniknięcie ⎕dwukrotnego wspominania lub wprowadzania zmiennej.
⍴Ama kształt A. Dla matrycy 4 na 7 kształt jest 4 7.
⍳jest generatorem indeksu. ⍳4jest 1 2 3 4. ⍳4 7to wektory (1 1)(1 2)...(4 7)ułożone w matrycy 4 na 7.
~Aprzerzuca kawałki A.
×mnożąc ⍳⍴Aprzez odwrócone bity, zachowujemy współrzędne wszystkich wolnych komórek i zamieniamy wszystkie ściany w 0 0.
,niszczy macierz par współrzędnych, tj. linearyzuje ją do wektora. W takim przypadku wektor będzie składał się z par.
∘.-⍨Alub A∘.-Aodejmuje elementy Aparami. Zauważ, że tutaj elementy Asame w sobie są parami.
| całkowita wartość
+/¨zsumuj każdą parę wartości bezwzględnych. To daje nam odległości siatki między każdą parą komórek w labiryncie, z wyjątkiem ścian.
1≥interesują nas tylko sąsiedzi w odległości nie większej niż 1, nie obejmuje to również ścian. Teraz mamy macierz sąsiedztwa wykresu.
∨.∧⍨⍣≡ Floyd - algorytm przechwytywania przechwytywania Warshalla
(f⍣n)A(nieużywany tutaj), gdzie nliczba całkowita jest operatorem mocy. Ma ona zastosowanie fdo A nczasów: f f ... f A.
(f⍣g)Agdzie gjest funkcją, to operator punktu stałego, znany również jako „limit mocy”. Utrzymuje się na obliczaniu serii A, f A, f f A, ... aż ((f⍣i)A) g ((f⍣(i+1))A)Zwraca true dla niektórych i. W tym przypadku używamy match ( ≡) jako g.
∨.∧⍨Alub A∨.∧Ajest krokiem w algorytmie Floyda. f.gjest uogólnieniem mnożenia macierzy ( +.×), tutaj używamy koniunkcji ( ∧) i disjunction ( ∨) zamiast +i ×.
⊃⌽ Po ⍣≡wystarczającym zastosowaniu kroku i osiągnięciu stanu stabilnego musimy spojrzeć w prawy górny róg matrycy, aby uzyskać wynik, więc odwracamy go ( ⌽) i bierzemy pierwszy, lewy górny element ( ⊃).
Wizualizacja ⍣≡kroków