Dyalog APL, 27 Zeichen
⊃⌽∨.∧⍨⍣≡1≥+/¨|∘.-⍨,(~×⍳∘⍴)⎕
⎕ausgewertete Eingabe. APL unterscheidet zwischen einer Matrix und einem Vektor von Vektoren. Dieses Programm geht davon aus, dass die Eingabe eine Matrix ist.
(~×⍳∘⍴)Aist eine Gabel äquivalent zu (~A) × ⍳⍴A. Es muss vermieden werden, ⎕zweimal zu erwähnen oder eine Variable einzuführen.
⍴Aist die Form von A. Für eine 4-mal-7-Matrix lautet die Form 4 7.
⍳ist der Indexgenerator. ⍳4ist 1 2 3 4. ⍳4 7sind die Vektoren, (1 1)(1 2)...(4 7)die in einer 4 × 7-Matrix angeordnet sind.
~Adreht die Bits von A.
×Durch Multiplikation ⍳⍴Amit den umgedrehten Bits behalten wir die Koordinaten aller freien Zellen bei und verwandeln alle Wände in 0 0.
,reist die Matrix der Koordinatenpaare, dh linearisiert sie in einen Vektor. In diesem Fall besteht der Vektor aus Paaren.
∘.-⍨Aoder A∘.-Asubtrahiert Elemente Apaarweise. Beachten Sie, dass die Elemente von Ahier selbst Paare sind.
| Absolutwert
+/¨Summiere jedes Paar absoluter Werte. Dies gibt uns die Gitterabstände zwischen jedem Zellenpaar im Labyrinth, abgesehen von Wänden.
1≥Wir sind nur an Nachbarn interessiert, die nicht weiter als 1 entfernt sind. Dies schließt auch Mauern aus. Jetzt haben wir die Adjazenzmatrix eines Graphen.
∨.∧⍨⍣≡ Floyd - Warshalls Transitiver Schließungsalgorithmus
(f⍣n)A(hier nicht verwendet) wobei neine ganze Zahl der Energieoperator ist. Es gilt fzu A nZeiten: f f ... f A.
(f⍣g)AWo gist eine Funktion, ist der Festpunktoperator, auch bekannt als "Leistungsgrenze". Es hält auf die Serie der Berechnung A, f A, f f A, ... bis ((f⍣i)A) g ((f⍣(i+1))A)kehrt gilt für einige i. In diesem Fall verwenden wir match ( ≡) als g.
∨.∧⍨Aoder A∨.∧Aist ein Schritt in Floyds Algorithmus. f.gist eine Verallgemeinerung der Matrixmultiplikation ( +.×), hier verwenden wir Konjunktion ( ∧) und Disjunktion ( ∨) anstelle von +und ×.
⊃⌽ Nachdem ⍣≡wir den Schritt genügend oft angewendet haben und einen stabilen Zustand erreicht haben, müssen wir die obere rechte Ecke der Matrix nachschlagen, um das Ergebnis zu erhalten. Wir drehen es ( ⌽) und nehmen das erste Objekt oben links ( ⊃).
Visualisierung der ⍣≡Schritte