Optimaler Triple-Town-Algorithmus

8

Ich habe versucht, einen optimalen Algorithmus für ein Problem zu finden, das vom Spiel Triple Town inspiriert wurde. Das Spiel geht so:

Sie platzieren Objekte in einem Raster und jedes Mal, wenn Sie einen Satz von drei erstellen, verdichten sie sich zu einem Objekt höherer Ebene an der Position des letzten platzierten Objekts .

Wenn Sie außerdem drei dieser b Objekte zusammenfügen, werden sie erneut komprimiert, um ein Objekt auf höherer Ebene zu bilden.

Hinweis: In diesen Diagrammen wird die Ebene eines Objekts ausgedrückt als i , b i und c und der Index bezeichnet Die Anzahl der Objekte in der Dreiergruppe.

Um Dinge zu vereinfachen, überlege ich nur, wann jedes Objekt, das Sie platzieren müssen, auf der niedrigsten Ebene ist.

Jetzt sind meine Fragen:

1: Gibt es einen Algorithmus, um die kleinste Menge an Gitterfläche zu bestimmen, die benötigt wird, um ein Objekt der Ebene x mit x zu erstellen?

Zum Beispiel benötigen Sie für Stufe a 1x1, für Stufe b 1x3, für Stufe c 1x5.

2: Können wir anhand der Dimensionen eines Gitters die höchste erreichbare Anzahl und die höchste erreichbare Anzahl an Objekten finden?

Zum Beispiel können Sie für ein 2x2 zwei Level 'a's und zwei Level' b's bekommen

3: Gibt es einen Algorithmus, um die optimale Reihenfolge und Position von Objekten zu finden, um bei einem festen Gitter das höchstmögliche Niveau zu erreichen?

Beispielsweise können Sie für ein 2x2 (1,1), (1,2), (2,2)

erhalten

4: Wenn eine Position eines beabsichtigten x-Objekts der Ebene gegeben ist, welcher Satz von Bewegungen minimiert den Platz, der benötigt wird, um dieses Objekt zu erstellen?

5: Was sind die optimalen Komplexitäten dieser Algorithmen?

Aktualisierung:

Eine Sache, die bei der Suche nach Lösungen wichtig ist, ist, dass das Abrufen eines Elements der Ebene x nicht an einem beliebigen Ort erfolgen kann .

Zum Beispiel: [ _ _ _ _ c] ist unmöglich in einem festen 1 zu 5 Raster zu erreichen, weil du dein letztes b auf dem 5. Platz brauchst und somit dein letztes a auf dem 5. Platz. Um also das erste b zu platzieren: [a _ _ _ _]->[a a _ _ _]->[_ _ b _ _] oder [_ a _ _ _]->[_ a a _ _]->[_ _ _ b _] . In beiden Fällen ist nicht genug Platz, um 3 'a' zu setzen, um das letzte b des c zu machen.

Eine andere Sache, können wir nicht davon ausgehen, dass alles zu einem 1-dimensionalen Gitter abgerollt werden kann . Das wird mit meinem nächsten Punkt klar.

Etwas Interessantes, das ich gefunden habe:

Es gibt eine minimale Nähe zur Grenze, die ein Level-c-Objekt in einem 1-dimensionalen Gitter haben kann. %Code%. So kann ein Level-c-Objekt in einem Raster von 1 mal 5 (optimal) nur an der 3. Position erstellt werden.

Daraus folgt, dass dies die höchste Stufe ist, die von einem beliebigen Zahlengitter in 1 gemacht werden kann. Nimm ein Gitter von 1 nach unendlich:

[_ _ a a a]->[_ _ _ b]->[_ a a a b]->[_ _ _ b b]->[a a a b b]->[_ _ c _ _]

Jetzt versuchen wir ein anderes c direkt daneben zu bekommen:

..._ a a a _ ... -> ... _ a a a b _ ... -> ... _ a a a b b _ ... -> ... _ c _ ...

Die einzige Option ist ..._ c a a a _ ... = ... _ c b _ ... or ... _ c _ b _ ... or ... _ c _ _ b _ ... , weil die anderen es unmöglich machen, ein weiteres b zwischen c und b zu bilden. Unsere einzige Option verhindert unsere einzige Möglichkeit, c direkt neben unserem ersten c zu erstellen, da es das letzte c davon abhält, dorthin zu gehen. Daher ist c in einer Dimension die höchste Ebene, die wir herstellen können. Mit anderen Worten, muss das Problem in zwei Dimensionen betrachtet werden .

    
Raufio 06.02.2013, 22:43
quelle

1 Antwort

2

EDIT: Das Folgende ist eigentlich falsch, und hier ist warum: tu, was es beschreibt, um ein "c" zu bekommen, hier ist, wie das geht: _ _ a a a - & gt; _ _ _ _ b - & gt; (..) _ _ _ b b - & gt; _ _ b b b - & gt; _ _ c _ _

Also ist das "c" jetzt in der Mitte der Zeile und das Voranstellen funktioniert nicht auf diese Weise. Ich lasse es hier, wenn jemand es liest, gibt es zumindest eine Erklärung, warum es falsch ist. Vielleicht spart dir das etwas Zeit, um über denselben Fehler nachzudenken.

[FALSCH VON HIER] 1: Sie können es immer in 3 + 2 * (x-1) tun, da Sie einfach die erforderlichen Elemente und für jede "Ebene" des Buchstabens "voranstellen". Beweis durch Induktion:

um ein "b" zu erhalten, benötigen Sie 3 + 2 * (1-1) = 3 Leerzeichen.

Wenn du Level x in 3 + 2 * (x-1) Räumen bekommst, nimmt Level x + 1 3 + 2 * (x-1) Räume für das Erstellen eines Charakters der Stufe x und 2 Speicherplatz, Kosten Sie 3 + 2 * (x-1) + 2 = 3 + 2 * ((x + 1) -1) Leerzeichen.

So, da haben Sie es, Sie können tatsächlich ein "c" in einem Rechteck von 1 Höhe und 5 Breite bekommen. Sie können ein "f" mit 13 Leerzeichen erhalten, und so weiter.

Denken Sie darüber nach, was dies nahelegt: Wenn Sie Ihren Brief in einen kleinen Bereich packen möchten, finden Sie einen kleinen Bereich, der 3 + 2 * (x-1) Leerzeichen enthält, und drehen Sie den Vorsatz bei Bedarf um. Dies bedeutet, dass Sie immer von der Position aus nach außen gehen können, in der Sie in Spiralen enden möchten. Hier ist der Unterschied: Du brauchst möglicherweise deinen letzten Stein jedes Levels, um aus wechselnden Richtungen zu kommen, damit du dich nicht von deinem Ausgangspunkt entfernst. Die Komplexität, alle Schritte tatsächlich zu durchlaufen, ist O (3 ^ x), da Sie für den nächsten 3 Buchstaben des vorherigen Niveaus benötigen, und es ist alles multiplikativ.

    
G. Bach 06.02.2013 23:12
quelle

Tags und Links