Algorithmus: Bestimmen Form von zwei Sektoren, die durch einen beliebigen Pfad abgegrenzt, und dann eine füllen

stimmen
2

Hinweis: Dies ist ein schwieriges Problem für jeden, die Logik Probleme mag, usw.

Jeder Raum ein rechteckiges zweidimensionales Gitter mit einer Höhe H und einer Breite W. Betrachten auf dem Gitter hat einen Wert, entweder 0 1oder 2. Anfangs ist jeder Raum auf dem Gitter ein 0, mit Ausnahme der Bereiche sind entlang jeder der vier Kanten, die zunächst einen sind 2.

Dann betrachtet einen beliebigen Pfad benachbarter (horizontal oder vertikal) Gitterplätze. Der Weg beginnt an ein 2und endet auf einem anderen 2. Jeder Raum entlang des Weges ist ein 1.

Der Weg teilt das Gitter in zwei „Sektoren“ von 0Räumen. Es ist ein Objekt , das auf einem nicht näher ruht 0Raum. Der „Sektor“ , die das Objekt nicht enthalten muss vollständig mit gefüllt werden 2.

Definieren einen Algorithmus, der die Zwischenräume , die bestimmt werden müssen 2aus 0, da ein Array (Liste) von Werten ( 0, 1oder 2), die den Werten in dem Raster entsprechen, und zwar von oben nach unten und dann von links nach rechts. Mit anderen Worten enthält das Element mit dem Index 0 in dem Feld den Wert des oberen linken Raumes in dem Gitter (zunächst a 2). Das Element mit dem Index 1 enthält den Wert des Raumes , in dem Raster , die in der linken Spalte ist, die zweite von oben, und so weiter. Das Element mit dem Index H enthält den Wert des Raumes , in dem Raster , die in der oberen Reihe ist , aber zweite von links, und so weiter.

Sobald der Algorithmus beendet und der leere „Sektor“ vollständig mit gefüllt sind 2s, muss der gleiche Algorithmus ausreichend sein , wieder den gleichen Prozess zu tun. Die zweite (und auf) Zeit wird der Weg noch von einem gezogenen 2zu einem anderen 2, über Räume 0, aber die „Grid“ ist kleiner , weil die 2s , die von anderen umgeben ist 2s kann nicht vom Pfad berührt werden (da der Weg ist entlang Räume 0).

Ich danke wem der Lage ist, dies für mich, um herauszufinden, sehr, sehr viel. Dies muss nicht in einer bestimmten Programmiersprache sein; in der Tat ist Pseudo-Code oder nur Englisch ausreichend. Danke noch einmal! Wenn Sie Fragen haben, lassen Sie einfach einen Kommentar und ich werde geben, was angegeben werden muss.

Veröffentlicht am 15/05/2010 um 22:07
quelle vom benutzer
In anderen Sprachen...                            


1 antworten

stimmen
3

Scheint mir eine grundlegende Flußfüllen Algorithmus die Arbeit erledigt bekommen würde:

  • Scannen Sie Array zum ersten 0finden Sie, und dann eine Flutfüllung von dort aus starten, die füllende 0Region mit einer anderen Zahl, sagen wir mal 3- das ist eines Ihrer „Sektoren“ bezeichnen wird.
  • Sobald das erledigt ist, Scannen wieder für ein 0und Flut von dort füllen, mit einer Füllung 4dieser Zeit.
  • Während sowohl die Füllungen können Sie die Überprüfung, ob Sie Ihr Objekt gefunden ist oder nicht; je nachdem, was zu füllen Sie es während finden, verfolgen diese Nummer.
  • Nachdem beide Füllungen fertig sind, prüfen Sie, welche nummeriert Region in den Gegenstand hatte - Flut wieder diese Region füllen, mit Rücken 0dieser Zeit.
  • Fülle die anderen nummerierten Region mit 2, und du bist fertig.

Das wird für jede Gitterkonfiguration arbeiten, solange es genau zwei 0Sektoren, die voneinander getrennt sind; so erneut die Anwendung des gleichen Algorithmus beliebig oft ist in Ordnung.

Edit: Minor Tweaks, können Sie eine Flut-Füllung oder zwei speichern -

  • Wenn Sie nicht Ihr Objekt in dem ersten Flut-fill finden, können Sie davon ausgehen , dass der andere Sektor hat es, so dass Sie nur die aktuelle Nummer mit erneut füllen 2und dem anderen Sektor allein lassen (da es bereits ist 0-gefüllten).
  • Alternativ, wenn Sie tun , um das Objekt in dem ersten Flut-fill finden, können Sie direkt den anderen Sektor mit füllen 2, und dann mit dem ersten Sektor wieder zu füllen 0.
Beantwortet am 15/05/2010 um 22:23
quelle vom benutzer

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more