Können diese Rechtecke einen rechteckigen Raum ausfüllen?
Bei einer Reihe von Rechtecken werden Sie gefragt, ob sie so angeordnet werden können, dass sie einen rechteckigen Raum ausfüllen.
Technische Daten
Angesichts einer Reihe von willkürlichen m x n
Rechtecken; 0 <= m, n <= 1000
Bestimmen Sie, ob es möglich ist, sie so anzuordnen, dass sie genau einen rechteckigen Bereich ohne Löcher oder Überlappungen abdecken. Die Rechtecke können nicht gedreht werden und jedes Rechteck darf nur einmal platziert werden.
Eingang
Die Eingabe hierfür ist sehr flexibel, solange die Eingabe eine Liste von Dimensionen mit zwei Räumen enthält. Zum Beispiel sind beide der folgenden Bedingungen gültig:
Durch Leerzeichen getrennt, Rückkehr
1 2
1 5
4 5
3 6
Liste der Abmessungen
[[1, 2], [1, 5], [4, 5], [3, 6]]
Ausgabe
Jede Art von wahr / falsch-Werten wie wahr / falsch, 0/1, T / F, wahr / falsch usw. Wenn Sie eine Ausgabemethode verwenden möchten, die nicht sehr offensichtlich ist, geben Sie dies bitte in Ihrer Antwort an.
Beispiele
Testfall 1
Eingang:
1 1
1 5
2 6
Ausgabe:
true
(oder ähnliches)
So arrangieren Sie es:
XYYYYY
ZZZZZZ
ZZZZZZ
Testfall 2
Eingang:
1 1
2 2
Ausgabe:
false
(oder ähnliches)
Erläuterung: Es wird offensichtlich, dass Sie nicht zwei Quadrate unterschiedlicher Größe anordnen und ihre Kanten in eine Linie bringen können.
Testfall 3
Eingang:
1 1
1 2
1 2
2 1
2 1
Ausgabe:
true
(oder ähnliches) So arrangieren Sie es:
AAB
DEB
DCC
Wie @ETHProductions hervorhob, können Sie für alle anderen Testfälle weiterhin Rechtecke mit einer gemeinsamen Kantenlänge kombinieren, bis Sie nur noch ein Rechteck haben. In diesem Testfall wird also nur der Code gebrochen, der diese Idee verwendet.
Testfall 4
Eingang:
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
Ausgabe:
true
(oder ähnliches)
So arrangieren Sie es:
AAABBBBEE
AAACCDDDD
FFFFFGGGH
FFFFFGGGH
IIIJJKKLH
IIIMMMMMH
Hinweis : Sie müssen nicht angeben, wie es angeordnet werden soll. Sie müssen nur bestimmen, ob es nicht angeordnet werden kann.
Das ist Codegolf, also gewinnt die kürzeste Antwort in Bytes! Ich akzeptiere die kürzeste Antwort ab dem 14. Januar, kann sie aber auch später einreichen, da ich immer noch upvotes geben kann! :)
Viel Spaß beim Golfen!
~ AL
PS Wenn Sie wissen, welches Tag auf dieses Problem angewendet werden soll, fügen Sie es bitte hinzu. Ich habe absolut keine Ahnung, was ich als anderes Tag als Code-Golf einsetzen soll.
BEARBEITEN : Ihr Programm sollte in der Lage sein, bis zu 25 Rechtecke in höchstens 10 Sekunden auf einem anständigen Computer zu verarbeiten (ich werde in dieser Regel recht flexibel sein).
EDIT : Ich habe die Einreichungsfrist bis zum letzten Tag des Jahres verlängert, aber ich bezweifle, dass ich bis dahin eine Antwort bekomme ...
EDIT : Ich habe die Einreichungsfrist um 2 Wochen verlängert. Wenn bis dahin keine weiteren Antworten eingehen, wird die aktuelle C-Antwort akzeptiert! :)
quelle
[[1, 2], [2, 1], [1, 1], [1, 2], [2, 1]]
(was arrangiert werden kannABB ACD EED
). Sie können diesen einfachen Testfall hinzufügen.Antworten:
C 1135,
1158,1231,1598BytesNun, es ist nach der angegebenen Frist, aber da es noch keine Antworten gibt, ist hier eine (etwas lange) in C.
Kehrt zurück:
Aktualisieren:
Der ursprüngliche Code könnte auf einigen Matrizen hängen bleiben und viel länger als die zulässigen 10s dauern. Die aktuelle Revision sollte alle Matrizen in unter 1s vervollständigen. Dies wird erreicht durch 1) Sortieren der Eingaberechtecke und 2) Überspringen wiederholter Größen beim Anpassen.
Golf gespielt:
UnGolfed:
Erläuterung: Wir haben 6 Funktionen:
main
,O
,Q
,F
,L
undT
.T
Es wird geprüft, ob an einer bestimmten Stelle Platz für das Rechteck ist.L
fil l s ein Rechteck in die Ausgangspuffer oder entfernt abwechselnd durch Überschreiben.O
undQ
Aufbau die linke und die obere Wand nach oben, jeweils undF
f Übel des Restes des Rechtecks , das durch iterative Suche.Obwohl die grundlegende Suche iterativ ist, eliminieren wir die große Mehrheit der möglichen Suchvektoren, indem wir zuerst die zulässigen Kombinationen von Breite und Höhe für das Master-Rechteck aufbauen und dann unmögliche Konfigurationen eliminieren. Bei größeren Rechtecken könnte zusätzliche Geschwindigkeit erzielt werden, indem die untere und die rechte Wand vor dem Füllen der Mitte bestimmt werden. Bei einer Beschränkung auf 25 innere Rechtecke ist dies jedoch nicht erforderlich, um eine angemessene Geschwindigkeit zu erzielen.
quelle
Haskell, 226 Bytes
Probieren Sie es auf Ideone
Wie es funktioniert
Dadurch wird rekursiv nach allen Teilkacheln gesucht, deren Form ein Young-Diagramm ist , wobei jeweils ein Rechteck hinzugefügt wird, und es wird geprüft, ob eines der Endergebnisse Rechtecke sind.
Um zu sehen, dass jede Kachelung eines Rechtecks auf diese Weise erstellt werden kann: Bei jeder Kachelung eines nicht leeren Young-Diagramms sei R die Menge der Rechtecke in der Kachelung, deren südwestliche Ecke kein anderes Rechteck berührt. Da jeder konkave Scheitelpunkt des Young-Diagramms an höchstens ein Rechteck in R an einer Kante angrenzt (nicht nur an einer Ecke angrenzt) und die Anzahl dieser konkaven Scheitelpunkte um eins geringer ist als die Anzahl der Rechtecke in R, muss mindestens eine vorhanden sein ein Rechteck in R, das kantenbenachbart zu keinem dieser konkaven Scheitelpunkte ist. Wenn Sie es entfernen, erhalten Sie ein weiteres Young-Diagramm, sodass wir durch Induktion fortfahren können.
quelle