Dyalog APL, 27 karakter
⊃⌽∨.∧⍨⍣≡1≥+/¨|∘.-⍨,(~×⍳∘⍴)⎕
⎕input yang dievaluasi. APL membedakan antara matriks dan vektor vektor. Program ini mengasumsikan bahwa input adalah sebuah matriks.
(~×⍳∘⍴)Aadalah garpu yang setara dengan (~A) × ⍳⍴A. Ini diperlukan untuk menghindari menyebutkan ⎕dua kali atau memperkenalkan variabel.
⍴Aadalah bentuk A. Untuk matriks 4-oleh-7 bentuknya adalah 4 7.
⍳adalah generator indeks. ⍳4adalah 1 2 3 4. ⍳4 7adalah vektor (1 1)(1 2)...(4 7)disusun dalam matriks 4-oleh-7.
~Amembalik bit A.
×dengan mengalikan ⍳⍴Adengan bit yang dibalik, kami menjaga koordinat semua sel bebas dan mengubah semua dinding menjadi 0 0.
,putar matriks pasangan koordinat, yaitu linearkan menjadi vektor. Dalam hal ini vektor akan terdiri dari pasangan.
∘.-⍨Aatau A∘.-Akurangi elemen Aberpasangan. Perhatikan bahwa di sini elemen dari Apasangan itu sendiri berpasangan.
| nilai mutlak
+/¨jumlah setiap pasangan nilai absolut. Ini memberi kita jarak grid antara setiap pasangan sel di labirin, kecuali untuk dinding.
1≥kami hanya tertahan di tetangga pada jarak tidak lebih dari 1, ini juga tidak termasuk dinding. Sekarang kita memiliki matriks adjacency grafik.
∨.∧⍨⍣≡ Floyd - Algoritma penutupan transitif Warshall
(f⍣n)A(tidak digunakan di sini) di mana nbilangan bulat adalah operator daya. Ini berlaku funtuk A nkali: f f ... f A.
(f⍣g)Adi mana gfungsi, adalah operator titik tetap, alias "batas daya". Itu terus komputasi seri A, f A, f f A, ... sampai ((f⍣i)A) g ((f⍣(i+1))A)kembali benar untuk beberapa i. Dalam hal ini kami menggunakan kecocokan ( ≡) sebagai g.
∨.∧⍨Aatau A∨.∧Amerupakan langkah dalam algoritma Floyd. f.gadalah generalisasi dari perkalian matriks ( +.×), di sini kami menggunakan kata hubung ( ∧) dan disjungsi ( ∨) sebagai ganti dari +dan ×.
⊃⌽ Setelah ⍣≡menerapkan langkah cukup lama dan mencapai kondisi stabil, kita harus mencari sudut kanan atas matriks untuk mendapatkan hasilnya, jadi kita balikkan ( ⌽) dan ambil item pertama, kiri atas ( ⊃).
Visualisasi ⍣≡langkah-langkahnya