Ces rectangles peuvent-ils remplir un espace rectangulaire?
Étant donné un tas de rectangles, on vous demande s'ils peuvent être disposés ou non pour remplir un espace rectangulaire.
Spécifications
Étant donné un tas de m x n
rectangles arbitraires ; 0 <= m, n <= 1000
, déterminez s'il est possible ou non de les disposer de manière à couvrir exactement une zone rectangulaire sans trous ni chevauchements. Les rectangles ne peuvent pas être tournés et chaque rectangle ne peut être placé qu'une seule fois.
Contribution
L'entrée pour cela est très flexible, tant que l'entrée donne une sorte de liste de dimensions à 2 espaces. Par exemple, les deux éléments suivants sont valides:
Séparé par l'espace, retour
1 2
1 5
4 5
3 6
Liste des dimensions
[[1, 2], [1, 5], [4, 5], [3, 6]]
Sortie
Toutes sortes de valeurs vraies / fausses comme true / false, 0/1, T / F, True / False, etc. Si vous allez utiliser une méthode de sortie qui n'est pas très évidente, veuillez préciser dans votre réponse.
Exemples
Cas de test 1
Contribution:
1 1
1 5
2 6
Sortie:
true
(ou quelque chose de similaire)
Comment l'organiser:
XYYYYY
ZZZZZZ
ZZZZZZ
Cas de test 2
Contribution:
1 1
2 2
Sortie:
false
(ou quelque chose de similaire)
Explication: Il devient évident que vous ne pouvez pas disposer deux carrés de tailles différentes et aligner leurs bords.
Cas de test 3
Contribution:
1 1
1 2
1 2
2 1
2 1
Sortie:
true
(ou quelque chose de similaire) Comment l'organiser:
AAB
DEB
DCC
Comme l'a souligné @ETHProductions, pour tous les autres cas de test, vous pouvez continuer à combiner des rectangles avec une longueur de bord commune jusqu'à ce que vous n'ayez qu'un seul rectangle, donc ce cas de test est juste pour casser tout code qui utilise cette idée.
Cas de test 4
Contribution:
3 2
4 1
2 1
4 1
2 1
5 2
3 2
1 4
3 2
2 1
2 1
1 1
5 1
Sortie:
true
(ou quelque chose de similaire)
Comment l'organiser:
AAABBBBEE
AAACCDDDD
FFFFFGGGH
FFFFFGGGH
IIIJJKKLH
IIIMMMMMH
Remarque : Vous n'avez pas besoin d'indiquer comment l'organiser, il vous suffit de déterminer s'il ne peut pas être organisé.
C'est le golf de code, donc la réponse la plus courte en octets gagne! J'accepterai la réponse la plus courte à partir du 14 janvier, mais n'hésitez pas à soumettre des réponses plus tard car je peux encore donner des votes! :)
Bon golf!
~ AL
PS Si vous savez quelle balise doit être appliquée à ce problème, veuillez l'ajouter, je n'ai absolument aucune idée de ce qu'il faut mettre comme balise autre que code-golf.
EDIT : Votre programme devrait être capable de traiter jusqu'à 25 rectangles, en au plus 10 secondes sur un ordinateur décent (je serai assez flexible sur cette règle).
EDIT : J'ai prolongé la date limite d'acceptation des soumissions jusqu'au dernier jour de l'année, mais je doute que j'obtienne une réponse d'ici là ...
EDIT : J'ai prolongé le délai d'acceptation des soumissions de 2 semaines, donc si aucune autre réponse n'arrive d'ici là, la réponse C actuelle sera acceptée! :)
la source
[[1, 2], [2, 1], [1, 1], [1, 2], [2, 1]]
(ce qui peut être organiséABB ACD EED
). Vous voudrez peut-être ajouter ce cas de test simple.Réponses:
C, 1135
115812311598octetsEh bien, c'est passé la date limite indiquée, mais vu qu'il n'y a pas encore de réponse, en voici une (un peu longue) en C.
Résultats:
Mise à jour:
Le code d'origine peut rester bloqué sur certaines matrices, ce qui prend beaucoup plus de temps que les 10 autorisées. La révision actuelle devrait compléter toutes les matrices en moins de 1s. Pour ce faire, 1) triez les rectangles d'entrée et 2) sautez les tailles répétées lors de l'ajustement.
Golfé:
Non golfé:
Explication: Nous avons 6 fonctions:
main
,O
,Q
,F
,L
etT
.T
t ests pour voir s'il y a de la place pour le rectangle à un endroit donné.L
fil l s un rectangle dans le tampon de sortie ou, supprime alternativement un en le remplaçant.O
etQ
accumuler les parois gauche et en haut, respectivement , etF
f maux du reste du rectangle par recherche itérative.Bien que la recherche de base soit itérative, nous éliminons la grande majorité des vecteurs de recherche possibles, tout d'abord en créant les combinaisons autorisées de largeur et de hauteur pour le rectangle maître, puis en éliminant les configurations impossibles. Une vitesse supplémentaire pourrait être gagnée dans les grands rectangles en déterminant les parois inférieure et droite avant de remplir le centre, mais elle n'est pas requise pour une vitesse décente lors de la limitation à 25 rectangles intérieurs.
la source
Haskell, 226 octets
Essayez-le sur Ideone
Comment ça marche
Cela recherche récursivement tous les pavages partiels dont la forme est un diagramme de Young , en ajoutant un rectangle à la fois, et vérifie si l'un des résultats finaux sont des rectangles.
Pour voir que n'importe quel pavage d'un rectangle peut être construit de cette façon: dans tout pavage d'un diagramme Young non vide, soit R l'ensemble des rectangles du pavage dont le coin sud-ouest ne touche aucun autre rectangle. Étant donné que chaque sommet concave du diagramme d'Young est adjacent à un bord (et non simplement un coin adjacent) à au plus un rectangle dans R, et le nombre de ces sommets concaves est inférieur de un au nombre de rectangles dans R, il doit y avoir au moins un rectangle dans R qui n'est adjacent à aucun de ces sommets concaves. Le supprimer donne un autre diagramme de Young, nous pouvons donc procéder par induction.
la source