Einführung
Es gibt ein kleines Dorf mit nur ein paar Häusern und leeren Feldern. Die örtlichen Bürokraten wollen das Dorf in Grundstücke aufteilen, so dass jedes Grundstück genau ein Haus enthält und die Grundstücksgrenzen ein schönes, geradliniges Raster bilden. Ihre Aufgabe ist es festzustellen, ob dies möglich ist.
Die Aufgabe
Ihre Eingabe ist ein rechteckiges 2D-Array von Bits. 1 steht für ein Haus und 0 für ein leeres Feld. Ihre Größe beträgt mindestens 1 × 1 und sie enthält mindestens eine 1. Sie können die Eingabe in jedem vernünftigen Format vornehmen (verschachtelte Liste von Ganzzahlen, Liste von Zeichenfolgen, mehrzeilige Zeichenfolge usw.).
Ihr Programm muss bestimmen, ob das Array mithilfe von geraden horizontalen und vertikalen Linien in Gitterzellen unterteilt werden kann, sodass jede Gitterzelle genau eine 1 enthält. Die Gitterzellen können unterschiedliche Größen und Formen haben, obwohl sie immer rechteckig sind. Die Linien müssen von einer Kante des Arrays zur gegenüberliegenden Kante verlaufen.
Das Folgende ist beispielsweise eine gültige Aufteilung eines Arrays:
00|0010|01|1
01|0000|00|0
--+----+--+-
00|0000|00|1
01|0010|01|0
--+----+--+-
01|1000|10|1
Die folgende Unterteilung ist ungültig, da es Gitterzellen mit keiner 1 oder mehr als einer 1 gibt:
00|0010|01|1
--+----+--+-
01|0000|00|0
00|0000|00|1
01|0010|01|0
--+----+--+-
00|1000|10|1
Wenn eine gültige Unterteilung vorliegt, geben Sie einen Wahrheitswert und ansonsten einen falschen Wert aus.
Regeln und Wertung
Sie können ein vollständiges Programm oder eine Funktion schreiben. Die niedrigste Byteanzahl gewinnt.
Testfälle
[[1]] -> True
[[0,1],[1,0]] -> True
[[1,1],[1,0]] -> False
[[1,0,1],[0,1,0]] -> True
[[1,0],[0,1],[0,1]] -> True
[[1,0,0],[0,0,1],[0,1,1]] -> True
[[1,1,1],[1,1,1],[1,1,1]] -> True
[[1,0,1],[0,1,0],[1,0,0]] -> True
[[1,0,0],[1,0,0],[0,1,1]] -> False
[[0,0,0,0,1],[1,0,0,1,0],[0,0,0,1,0]] -> False
[[0,0,1,0,1],[0,0,0,1,0],[0,0,0,0,0]] -> True
[[1,1,0,0,0],[0,0,0,0,0],[1,0,1,0,0]] -> True
[[1,1,0,1,1],[0,1,0,1,1],[1,0,0,0,0]] -> True
[[0,0,0,0,0,0,0],[0,1,1,1,0,1,0],[0,1,0,0,1,0,0],[0,0,0,0,0,0,1],[0,0,1,0,0,0,1],[1,1,0,1,1,0,0]] -> False
[[1,1,0,0,0,0,0],[1,0,1,1,0,1,0],[0,0,0,0,1,0,0],[0,1,0,1,1,0,0],[1,0,0,0,1,1,0],[0,0,0,0,0,1,0]] -> False
[[0,1,0,1,1,1,0],[0,0,0,0,1,0,0],[0,0,0,0,0,0,0],[1,0,0,1,0,0,0],[0,0,0,0,0,0,0],[0,0,0,0,0,0,1]] -> True
[[0,1,0,0,1,0,1],[1,0,0,0,1,0,1],[0,0,1,0,1,0,1],[1,0,0,0,1,1,0],[0,0,0,1,1,1,0],[0,1,0,0,1,0,1]] -> True
[[0,1,0,0,1,0,0,1,0],[0,0,0,0,1,1,0,1,0],[1,1,0,0,1,0,0,0,0],[0,0,1,0,1,0,1,0,0],[0,0,1,0,1,0,1,0,0],[0,1,0,0,0,1,0,0,1],[0,1,0,0,0,0,1,0,0]] -> False
[[1,0,1,0,0,1,1,0,1],[0,1,1,0,0,1,1,0,1],[1,0,0,0,0,1,0,0,0],[0,0,0,0,0,0,0,0,0],[0,0,1,0,0,0,0,1,1],[0,1,1,0,1,0,1,0,1],[1,0,1,0,0,1,1,0,1]] -> True
[[1, 0, 1], [0, 1, 0], [1, 0, 0]]
Das war die einzige 3x3-Matrix, bei der mein neuer Ansatz versagte.Antworten:
Pyth,
3029262423 BytesProbieren Sie es online aus.
Ich bin sicher, das wird kürzer. Das ist O (2 Min. ) , Wobei m und n die Breite und Höhe des Arrays sind, aber die letzten beiden Testfälle auf meinem Laptop mit Akku (i5-5200U mit eingeschränkter Leistung) in 45 Sekunden abgeschlossen sind.
Gibt die Anzahl der Lösungen aus.
Erläuterung
Die Arbeit mit fünfdimensionalen Arrays macht wirklich Spaß. </ sarcasm> Sie sollten nicht verstehen, wie das auch mit der Erklärung funktioniert.
quelle
Gelee , 22 Bytes
Probieren Sie es online!
quelle
Haskell , 116 Bytes
Probieren Sie es online!
quelle
mergerows
inm
.[[1,0],[0,1],[1,0]]
. Das Problem ist, dass ein gieriger Zusammenbruch einem späteren besseren Zusammenbruch im Wege stehen kann.[[1,1],[1,0]]
behindert mein Zusammenbruch fälschlicherweise die[[1],[1],[1]]
Lösung. Lass mich darüber schlafen oder soll ich es löschen?Gelee , 20 Bytes
Dies ist immer noch eine Brute-Force-Lösung, aber sie ist viel schneller als meine andere Antwort - die die letzten beiden Testfälle auf TIO nicht bewältigen kann - und bearbeitet alle Testfälle in ~ 4 Sekunden.
Probieren Sie es online!
Wie es funktioniert
quelle