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 ว่างเปล่ามีอีกหนึ่งการปูกระเบื้องที่ถูกต้องและผลตอบแทนy1
มิฉะนั้นฉันจะใช้พิกัดแรกในรายการ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