Pyth, 30 29 ไบต์
L?bsmy-tb]dfq1.a-VThbb1y*FUMQ
ลองใช้ออนไลน์: ชุดสาธิต / ทดสอบ
อินพุตตัวอย่างทั้งหมดรันในคอมไพเลอร์ออนไลน์ คนสุดท้ายใช้เวลาไม่กี่วินาทีแม้ว่า
คำอธิบาย:
y
ในรหัสของฉันฉันจะกำหนดฟังก์ชันเวียน ฟังก์ชั่นนี้y
ใช้รายการของพิกัด 2D และส่งคืนจำนวนโดมิโนที่แตกต่างกันโดยใช้พิกัดเหล่านี้ เช่นy([[0,0], [0,1]]) = 1
(โดมิโนแนวนอนหนึ่งอัน), y([[0,0], [1,1]]) = 0
(พิกัดไม่ได้อยู่ติดกัน) และy([[0,0], [0,1], [1,0], [1,1]]) = 2
(ทั้งสองแนวนอนหรือแนวตั้งสองแต้ม) หลังจากกำหนดฟังก์ชั่นที่ผมจะเรียกมันว่าด้วยพิกัดทั้งหมดด้วย[x,y]
x in [0, 1, m-1], y in [0, 1, n-1]
ฟังก์ชั่นวนซ้ำทำงานอย่างไร มันค่อนข้างง่าย ถ้ารายการของ coords ว่างเปล่ามีอีกหนึ่งการปูกระเบื้องที่ถูกต้องและผลตอบแทนy
1
มิฉะนั้นฉันจะใช้พิกัดแรกในรายการb[0]
และค้นหาพิกัดที่เหลือสำหรับเพื่อนบ้าน หากไม่มีเพื่อนบ้านไปb[0]
แล้วก็ไม่มีกระเบื้องที่เป็นไปได้ดังนั้นฉันกลับ 0 หากมีเพื่อนบ้านหนึ่งคนหรือมากกว่านั้นจำนวนของกระเบื้องก็คือ (จำนวนของกระเบื้องที่ฉันเชื่อมต่อb[0]
กับเพื่อนบ้านแรกผ่านโดมิโนบวก จำนวนการเอียงที่ฉันเชื่อมต่อb[0]
กับเพื่อนบ้านที่สองบวก ... ) ดังนั้นฉันจึงเรียกใช้ฟังก์ชั่นซ้ำ ๆ สำหรับแต่ละเพื่อนบ้านด้วยรายการที่สั้นลง (โดยลบทั้งสองสายb[0]
และเพื่อนบ้าน) หลังจากนั้นฉันก็สรุปผลทั้งหมดแล้วคืนพวกเขา
เนื่องจากลำดับของ coords จะมีเพียงสองประเทศเท่านั้นที่เป็นไปได้เพื่อนบ้านทางด้านขวาและด้านล่าง แต่อัลกอริทึมของฉันไม่สนใจสิ่งนั้น
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