Dyalog APL, 27 자
⊃⌽∨.∧⍨⍣≡1≥+/¨|∘.-⍨,(~×⍳∘⍴)⎕
⎕
입력 평가. APL은 행렬과 벡터로 구성된 벡터를 구분합니다. 이 프로그램은 입력이 행렬이라고 가정합니다.
(~×⍳∘⍴)A
는 포크에 해당합니다 (~A) × ⍳⍴A
. ⎕
두 번 언급 하거나 변수를 도입 하지 않아야 합니다.
⍴A
의 모양입니다 A
. 4x7 행렬의 경우 모양은 4 7
입니다.
⍳
인덱스 생성기입니다. ⍳4
입니다 1 2 3 4
. ⍳4 7
는 4x7 (1 1)(1 2)...(4 7)
행렬로 배열 된 벡터 입니다.
~A
의 비트를 뒤집습니다 A
.
×
⍳⍴A
뒤집힌 비트 를 곱하면 모든 자유 셀의 좌표를 유지하고 모든 벽을로 바꿉니다 0 0
.
,
좌표 쌍의 행렬을 모방합니다. 즉, 벡터로 선형화합니다. 이 경우 벡터는 쌍으로 구성됩니다.
∘.-⍨A
또는 pairwise A∘.-A
요소를 뺍니다 A
. 여기서 요소의 요소는 A
쌍입니다.
|
절대 값
+/¨
각 절대 값 쌍을 합산하십시오. 이것은 미로의 모든 세포 쌍 사이의 그리드 거리를 제공하여 벽을 절약합니다.
1≥
우리는 1 이하의 거리에서 이웃에게만 모욕을받으며 벽도 제외합니다. 이제 그래프의 인접 행렬이 있습니다.
∨.∧⍨⍣≡
플로이드-워샬의 전이 폐쇄 알고리즘
(f⍣n)A
여기서,는 (여기에 사용되지 않은) n
정수 파워 연산자이다. 그것은 적용 f
에 A
n
시간 : f f ... f A
.
(f⍣g)A
여기서 g
함수는 "전력 제한"이라고하는 고정 소수점 연산자입니다. 그것은 일련의 계산에 유지 A
, f A
, f f A
, ...까지 ((f⍣i)A) g ((f⍣(i+1))A)
일부 TRUE를 반환합니다 i
. 이 경우 match ( ≡
)를로 사용 g
합니다.
∨.∧⍨A
또는 A∨.∧A
Floyd 알고리즘의 한 단계입니다. f.g
행렬 곱셈 (일반화이다 +.×
), 여기에서 우리는 함께 (사용 ∧
)과 이접 ( ∨
대신) +
및 ×
.
⊃⌽
한 ⍣≡
단계 충분한 시간을 적용하고 안정된 상태에 도달, 우리는 우리가 그것을 (플립, 그래서 결과를 얻을 수있는 행렬의 오른쪽 상단 모서리를 검색해야한다 ⌽
) 첫 번째, 왼쪽 위 항목을 ( ⊃
).
⍣≡
의 단계 시각화