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 yprende 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 yritorni 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