APL Dyalog, 27 ký tự
⊃⌽∨.∧⍨⍣≡1≥+/¨|∘.-⍨,(~×⍳∘⍴)⎕
⎕
đánh giá đầu vào. APL phân biệt giữa ma trận và vectơ vectơ. Chương trình này giả định rằng đầu vào là một ma trận.
(~×⍳∘⍴)A
là một ngã ba tương đương với (~A) × ⍳⍴A
. Cần tránh nhắc đến ⎕
hai lần hoặc giới thiệu một biến.
⍴A
là hình dạng của A
. Đối với ma trận 4 nhân 7, hình dạng là 4 7
.
⍳
là trình tạo chỉ số. ⍳4
là 1 2 3 4
. ⍳4 7
là các vectơ (1 1)(1 2)...(4 7)
được sắp xếp theo ma trận 4 nhân 7.
~A
lật các bit của A
.
×
bằng cách nhân ⍳⍴A
với các bit bị lật, chúng ta bảo toàn tọa độ của tất cả các ô tự do và biến tất cả các bức tường thành 0 0
.
,
phá hủy ma trận của các cặp tọa độ, tức là tuyến tính hóa nó thành một vectơ. Trong trường hợp này, vectơ sẽ bao gồm các cặp.
∘.-⍨A
hoặc A∘.-A
trừ các yếu tố của A
cặp đôi. Lưu ý rằng ở đây các yếu tố của A
chính họ là cặp.
|
giá trị tuyệt đối
+/¨
tổng hợp từng cặp giá trị tuyệt đối. Điều này cho chúng ta khoảng cách lưới giữa mỗi cặp ô trong mê cung, tiết kiệm cho các bức tường.
1≥
chúng tôi chỉ quan tâm đến hàng xóm ở khoảng cách không quá 1, điều này cũng không bao gồm các bức tường. Bây giờ chúng ta có một ma trận kề của đồ thị.
∨.∧⍨⍣≡
Floyd - Thuật toán đóng bắc cầu của Warshall
(f⍣n)A
(không được sử dụng ở đây) trong đó n
một số nguyên là toán tử công suất. Nó áp dụng f
cho A
n
thời gian : f f ... f A
.
(f⍣g)A
trong đó g
là một hàm, là toán tử điểm cố định, còn gọi là "giới hạn công suất". Nó giữ trên máy tính series A
, f A
, f f A
, ... cho đến khi ((f⍣i)A) g ((f⍣(i+1))A)
trở về đúng đối với một số i
. Trong trường hợp này, chúng tôi sử dụng match ( ≡
) là g
.
∨.∧⍨A
hoặc A∨.∧A
là một bước trong thuật toán của Floyd. f.g
là một khái quát của phép nhân ma trận ( +.×
), ở đây chúng tôi sử dụng kết hợp ( ∧
) và phân biệt ( ∨
) thay cho +
và ×
.
⊃⌽
Sau khi ⍣≡
đã áp dụng bước đủ thời gian và đạt đến trạng thái ổn định, chúng ta phải tìm góc trên bên phải của ma trận để có kết quả, vì vậy chúng ta lật nó ( ⌽
) và lấy mục đầu tiên, trên cùng bên trái ( ⊃
).
Hình dung các ⍣≡
bước của