Ich habe eine "würfelförmige" 3D-Matrix, in der einige Zellen gefüllt und andere leer sind. Ein geschlossenes von gefüllten Zellen umschlossenes Gebiet repräsentiert eine hohle Form. Zum Beispiel könnten die Zellen in der Matrix so gefüllt sein, dass sie gemeinsam die Oberfläche einer hohlen Kugel bilden. Jetzt möchte ich eine effiziente Möglichkeit finden, um das Innere dieser Kugel zu füllen: Wenn eine Zelle C0
in alle Richtungen von gefüllten Zellen umgeben ist (die gefüllte Zelle in dieser Richtung muss kein unmittelbarer Nachbar von C0
sein), dann fülle C0
.
Ein naiver Weg wäre der folgende :-
Für jede Zelle scannen Sie in die Richtungen +X, -X, +Y, -Y, +Z, -Z und prüfen, ob Sie in jede Richtung auf eine gefüllte Zelle treffen.
Wenn in jede Richtung eine gefüllte Zelle erreicht wird, dann füllen Sie diese Zelle (da sie Teil des Inneren einer Form ist).
Wenn Sie das Ende des Rasters auch nur in einer Richtung erreichen, ohne auf eine gefüllte Zelle zu treffen, bleibt die betrachtete Zelle nicht im Inneren einer Form, und sollte unfilled bleiben.
Die Komplexität des obigen Ansatzes beträgt O(n^4)
, wobei die Dimension des 3D-Gitters n*n*n
ist.
Eine Optimierung könnte wie folgt sein :-
Wenn für eine unfilled-Zelle C[x][y][z], wir auf jede Richtung eine gefüllte Zelle treffen, dann muss nicht nur C[x][y][z] gefüllt werden, es ist auch garantiert, dass alle Zellen, die wir gerade gescannt haben (d.h. {in +X-Richtung, alle Zellen C[x][y][z], C[x+1][y][z], C[x+2][y][z], ..., bis zur ersten gefüllten Zelle}, ähnlich für -X, +Y, -Y, +Z, -Z-Richtung) Teil des Inneren einer Form sein müssen und daher gefüllt werden müssen.
Ein weiterer Ansatz könnte wie folgt sein :-
Wenn für eine unfilled-Zelle C[x][y][z] in, sagen wir, +X-Richtung keine gefüllte Zelle erreicht wird, wird nicht nur C[x][y][z] unfilled bleiben, es ist auch garantiert, dass alle Zellen, die wir gerade gescannt haben (d.h. in +X-Richtung, alle Zellen C[x][y][z], C[x+1][y][z], C[x+2][y][z], ..., bis zum Ende des Gitters) Teil des Äußeren sein müssen und daher unfilled bleiben müssen.
Kann jemand einen effizienteren Ansatz für dieses Problem vorschlagen? Selbst einfache Optimierungen wie oben, die die Ordnung der Zeitkomplexität nicht reduzieren, sind willkommen.