Pyth, 30 29 바이트
L?bsmy-tb]dfq1.a-VThbb1y*FUMQ
온라인 사용해보기 : 데모 / 테스트 스위트
모든 예제 입력은 온라인 컴파일러에서 실행됩니다. 마지막 것은 몇 초가 걸립니다.
설명:
내 코드에서는 재귀 함수를 정의합니다 y
. 이 함수 y
는 2D 좌표 목록을 가져 와서이 좌표를 사용하여 다른 도미노 타일링 수를 반환합니다. 예 : y([[0,0], [0,1]]) = 1
(1 개의 수평 도미노), y([[0,0], [1,1]]) = 0
(좌표가 인접하지 않음) 및 y([[0,0], [0,1], [1,0], [1,1]]) = 2
(2 개의 수평 또는 2 개의 수직 도미노). 함수를 정의한 후로 모든 좌표 [x,y]
로 호출합니다 x in [0, 1, m-1], y in [0, 1, n-1]
.
재귀 함수는 어떻게 작동합니까? 아주 간단합니다. 좌표 목록이 비어 있으면 정확히 하나의 유효한 바둑판 식 배열이 있고를 y
반환합니다 1
.
그렇지 않으면 목록의 첫 번째 좌표를 가져 와서 b[0]
나머지 좌표를 검색하여 이웃을 찾습니다. 에 이웃 b[0]
이 없으면 가능한 타일링이 없으므로 0을 반환합니다. 이웃이 하나 이상인 경우 타일링 수는 ( b[0]
도미를 통해 첫 번째 이웃과 연결 하는 타일링 수에 더하기를 더한 값입니다. b[0]
두 번째 이웃과 연결 하는 타일링 수 플러스 ...) 그래서 나는 단축 된 목록을 가진 각 이웃에 대해 함수를 재귀 적으로 호출합니다 (두 개의 좌표 b[0]
와 이웃 을 제거하여 ). 그 후 나는 모든 결과를 요약하고 반환합니다.
코드의 순서로 인해 항상 오른쪽과 아래에 하나씩 두 개의 이웃 만 가능합니다. 그러나 내 알고리즘은 그것에 관심이 없습니다.
UMQ convert the input numbers into ranges
*F Cartesian product (coords of each square)
L define a function y(b):
?b if len(b) > 0:
f b filter b for squares T, which satisfy:
.a-VThb Euclidean distance between T and b[0]
q1 is equal to 1 (direct neighbors)
m map each neighbor d to:
-tb]d remove d from b[1]
y and call recursively y with the rest
s sum all those values and return them
else:
1 return 1 (valid domino tiling found)
y*FUMQ Call y with all coords and print the result