Stellen wir uns vor, wir haben eine Bitmatrix (die mindestens eine enthält 1
):
0 1 0 1 1 0 1 0 0 1 0
0 1 0 1 0 0 1 0 1 1 0
0 0 1 0 1 1 0 1 0 1 0
1 1 0 0 1 0 0 1 1 0 1
0 0 0 1 0 1 1 0 0 1 0
Wir wollen einige der Bits in dieser Matrix so setzen, dass sie einen zusammenhängenden Blob von 1
s bilden, in dem jeder durch orthogonale Bewegung 1
direkt oder indirekt miteinander verbunden ist 1
:
0 1 1 1 1 1 1 0 0 1 0
0 1 0 1 0 0 1 0 1 1 0
0 1 1 0 1 1 1 1 0 1 0
1 1 0 0 1 0 0 1 1 1 1
0 0 0 1 1 1 1 0 0 1 0
(Sie können dies deutlicher sehen, indem Sie 1
mit der Suchfunktion Ihres Browsers nach suchen.)
Wir möchten jedoch auch die Anzahl der von uns gesetzten Bits minimieren.
Die Aufgabe
Geben Sie bei einer gegebenen Matrix (oder einem Array von Arrays) von Bits oder Booleschen Werten die minimale Anzahl von Bits zurück, die gesetzt werden müssen, um einen zusammenhängenden Kontinent von 1
s zu erstellen . Es sollte möglich sein, von einem gesetzten Bit in der Matrix zu einem anderen zu gelangen, indem man sich nur in orthogonaler Richtung zu anderen gesetzten Bits bewegt.
Dies ist Code-Golf , daher gewinnt die kürzeste gültige Übermittlung (gemessen in Bytes).
Testfälle
0 1 0 1 1 0 1 0 0 1 0
0 1 0 1 0 0 1 0 1 1 0
0 0 1 0 1 1 0 1 0 1 0
1 1 0 0 1 0 0 1 1 0 1
0 0 0 1 0 1 1 0 0 1 0
=> 6
1 0 0 0 0 0 1 0 0
1 1 0 0 1 1 1 0 0
1 1 1 0 1 1 1 1 1
0 1 0 0 0 0 0 0 0
0 0 0 0 0 1 1 1 1
0 1 0 0 0 0 1 1 0
1 0 0 0 0 0 1 0 0
=> 4
0 0 0 1 1 1 0 1 1
0 0 1 0 0 0 0 1 0
0 0 1 1 1 1 1 1 0
1 1 0 0 1 1 0 0 0
0 0 1 1 1 0 0 1 1
0 1 1 1 0 0 0 0 0
1 1 1 0 0 1 1 1 0
1 1 1 0 1 1 0 1 1
0 0 0 0 1 0 0 0 1
1 1 0 0 1 1 0 1 1
0 0 0 0 0 0 0 1 0
0 1 1 1 1 0 0 0 0
0 0 0 1 1 0 0 0 1
0 1 0 0 1 0 1 1 0
0 1 1 1 0 0 0 0 1
=> 8
1 1 1 1 1
1 1 1 1 1
1 1 1 1 1
1 1 1 1 1
=> 0
quelle
1
die Matrix keine enthält ?Antworten:
C (gcc),
308306 BytesDie Funktion
f
empfängt(height, width, flattened array, pointer to ans)
und gibt die Antwort per Zeiger zurück.Wenn
1
die Matrix keine enthält , wird sie zurückgegeben0
.Probieren Sie es online aus!
Ungolfed:
quelle
Python 2 , 611 Bytes
Ein vollständiges Programm, das eine Liste von Listen durch Benutzereingaben erstellt. Die Funktionen
I
undd
zählen die Anzahl der Inseln im Array. Die for-Schleife am Ende listet alle Möglichkeiten auf, wo Sie0
s in1
s ändern können. Wenn nur noch eine Insel übrig ist, wird die Anzahl der1
zur Liste hinzugefügten s gespeichertC
. Das Minimum dieser Liste ist die minimale Anzahl von Bitflips, die erforderlich sind, um Inseln zu verbinden. Es ist ein sehr langsamer Algorithmus, daher werden die in weniger als 60 Jahren angegebenen Testfälle nicht ausgeführt (ich habe es nicht länger versucht), aber ich habe einige kleinere (~ 5x5) Testfälle ausprobiert und es scheint korrekt zu funktionieren. Ich habe den Inselzählalgorithmus von dieser Seite erhalten.Probieren Sie es online aus!
Vorregulierte Version, bevor ich ein paar Dinge optimiert habe:
quelle