Pyth, 30 29 byte
L?bsmy-tb]dfq1.a-VThbb1y*FUMQ
Cobalah online: Demonstration / Test Suite
Semua input contoh dijalankan di kompiler online. Yang terakhir membutuhkan beberapa detik.
Penjelasan:
Dalam kode saya, saya akan mendefinisikan fungsi rekursif y
. Fungsi ini y
mengambil daftar koordinat 2D dan mengembalikan jumlah dominasi yang berbeda menggunakan koordinat ini. Misalnya y([[0,0], [0,1]]) = 1
(satu domino horisontal), y([[0,0], [1,1]]) = 0
(koordinat tidak berdekatan) dan y([[0,0], [0,1], [1,0], [1,1]]) = 2
(baik dua domino horizontal atau dua). Setelah mendefinisikan fungsi saya akan memanggilnya dengan semua koordinat [x,y]
dengan x in [0, 1, m-1], y in [0, 1, n-1]
.
Bagaimana cara kerja fungsi rekursif? Sederhana saja. Jika daftar coords kosong, hanya ada satu ubin yang valid dan y
kembali 1
.
Kalau tidak, saya mengambil koordinat pertama dalam daftar b[0]
, dan mencari tetangga yang tersisa untuk tetangga. Jika tidak ada tetangga untuk b[0]
, maka tidak ada ubin mungkin, maka saya kembali 0. Jika ada satu atau lebih tetangga, maka jumlah miring adalah (jumlah miring di mana saya terhubung b[0]
dengan tetangga pertama melalui domina, ditambah jumlah miring di mana saya terhubung b[0]
dengan tetangga kedua, ditambah ...) Jadi saya sebut fungsi secara rekursif untuk setiap tetangga dengan daftar singkat (dengan menghapus dua coord b[0]
dan tetangga). Setelah itu saya meringkas semua hasil dan mengembalikannya.
Karena urutan koordinasi selalu hanya ada dua tetangga, satu di sisi kanan dan satu di bawah. Tetapi algoritma saya tidak peduli tentang itu.
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