Pyth, 30 29 byte
L?bsmy-tb]dfq1.a-VThbb1y*FUMQ
Provalo online: Dimostrazione / Test Suite
Tutti gli input di esempio vengono eseguiti nel compilatore online. L'ultimo richiede alcuni secondi.
Spiegazione:
Nel mio codice definirò una funzione ricorsiva y
. La funzione y
prende un elenco di coordinate 2D e restituisce il numero di diversi tetti domino usando queste coordinate. Ad esempio y([[0,0], [0,1]]) = 1
(un domino orizzontale), y([[0,0], [1,1]]) = 0
(le coordinate non sono adiacenti) e y([[0,0], [0,1], [1,0], [1,1]]) = 2
(due domino orizzontali o due verticali). Dopo aver definito la funzione, la chiamerò con tutte le coordinate [x,y]
con x in [0, 1, m-1], y in [0, 1, n-1]
.
Come funziona la funzione ricorsiva? È abbastanza semplice. Se l'elenco dei coords è vuoto, esiste esattamente una piastrellatura e y
ritorni validi 1
.
Altrimenti prendo la prima coordinata nell'elenco b[0]
e cerco le coordinate rimanenti per un vicino. Se non è presente un vicino b[0]
, non è possibile eseguire la piastrellatura, quindi restituisco 0. Se sono presenti uno o più vicini, il numero di tasselli è (il numero di tasselli in cui mi collego b[0]
al primo vicino tramite una domina, oltre a il numero di tasselli in cui mi collego b[0]
con il secondo vicino, più ...) Quindi chiamo ricorsivamente la funzione per ciascun vicino con l'elenco abbreviato (rimuovendo i due cordoni b[0]
e il vicino). Successivamente riassumo tutti i risultati e li restituisco.
A causa dell'ordine dei cordoni ci sono sempre solo due vicini possibili, quello a destra e quello in basso. Ma al mio algoritmo non interessa.
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