Écrivez un programme ou une fonction qui, étant donné n et m positifs , calcule le nombre de pavages domino distincts valides que vous pouvez insérer dans un rectangle n par m . Il s'agit de la séquence A099390 dans l' Encyclopédie en ligne des séquences de nombres entiers . Vous pouvez prendre les entrées en tant qu'argument (s) de fonction, CLA ou sur stdin, dans n'importe quel format raisonnable. Vous devez renvoyer ou imprimer un seul entier en sortie.
Chaque pavage ne doit laisser aucun espace et chaque pavage distinct est compté, y compris les rotations, les réflexions, etc. Par exemple, les pavages pour 2x3 sont:
|-- ||| --|
|-- ||| --|
Exemples d'entrées / sorties:
1, 9 -> 0
2, 2 -> 2
2, 3 -> 3
4, 4 -> 36
4, 6 -> 281
6, 6 -> 6728
7, 10 -> 53175517
Votre programme devrait théoriquement fonctionner pour n et m , mais si votre programme nécessite trop de mémoire ou si votre type de données déborde, il est excusé. Cependant, votre programme doit fonctionner correctement pour tout n, m <= 8.
Le code le plus court en octets gagne.
Réponses:
Pyth,
3029 octetsEssayez-le en ligne: Demonstration / Test Suite
Tous les exemples d'entrées s'exécutent dans le compilateur en ligne. Le dernier prend cependant quelques secondes.
Explication:
Dans mon code, je définirai une fonction récursive
y
. La fonctiony
prend une liste de coordonnées 2D et renvoie le nombre de pavages de dominos différents en utilisant ces coordonnées. Par exempley([[0,0], [0,1]]) = 1
(un domino horizontal),y([[0,0], [1,1]]) = 0
(les coordonnées ne sont pas adjacentes) ety([[0,0], [0,1], [1,0], [1,1]]) = 2
(soit deux dominos horizontaux soit deux dominos verticaux). Après avoir défini la fonction, je l'appellerai avec toutes les coordonnées[x,y]
avecx in [0, 1, m-1], y in [0, 1, n-1]
.Comment fonctionne la fonction récursive? C'est assez simple. Si la liste des accords est vide, il y a exactement un pavage valide et
y
retourne1
.Sinon, je prends la première coordonnée de la liste
b[0]
et recherche les coordonnées restantes pour un voisin. S'il n'y a pas de voisinb[0]
, alors il n'y a pas de mosaïque possible, donc je retourne 0. S'il y a un ou plusieurs voisins, alors le nombre de mosaïques est (le nombre de mosaïques où je me connecteb[0]
avec le premier voisin via une domina, plus le nombre de pavages où je me connecteb[0]
avec le deuxième voisin, plus ...) J'appelle donc la fonction récursivement pour chaque voisin avec la liste raccourcie (en supprimant les deux coordsb[0]
et le voisin). Ensuite, je résume tous les résultats et les renvoie.En raison de l'ordre des coordonnées, il n'y a toujours que deux voisins possibles, celui de droite et celui du dessous. Mais mon algorithme ne s'en soucie pas.
la source
Matlab, 292
Je suis sûr que cela peut être beaucoup raccourci simplement en le portant dans une autre langue.
L'idée de base est le bruteforcing: j'ai trouvé une sorte d'énumération de toutes les façons de placer
m*n/2
des briques domino sur unem*n
planche. Mais cette énumération comprend également de nombreux pavages invalides (des briques qui se chevauchent ou sortent du tableau). Le programme construit donc tous ces pavages et ne compte que les pavés valides. La complexité d'exécution est sur le pointO(2^(m*n/2) * m*n)
. La mémoire n'est pas un problème8x8
car elle n'a besoin que deO(m*n)
mémoire. Mais le temps nécessaire8x8
est d'environ 20 jours.Voici la version entièrement commentée qui explique ce qui se passe.
PS: Si quelqu'un sait comment faire fonctionner la surbrillance de la syntaxe Matlab, veuillez inclure la balise correspondante dans cette réponse!
Voici celui entièrement golfé:
la source
C89, 230 octets
Pour plus de lisibilité, j'ai enveloppé cette réponse à la main - toutes les nouvelles lignes peuvent être supprimées en toute sécurité pour atteindre 230 octets.
Définit une fonction
int g(int n, int m)
qui renvoie le nombre de pavages. Il utilise une fonction d'assistancef
qui itère sur tous les pavages valides en plaçant un domino, récursif, puis en supprimant le domino sur une carte partagée.la source
Python 243
J'ai opté pour une approche par force brute:
S'ils correspondent tous et qu'il ne reste aucun espace, nous avons une entrée valide.
Voici le code:
la source