2013-04-09 9 views
9

Wie kann ich mit Zahlen in einem quadratischen 2D-Array zu füllen, so dass ein (zufälliger) Pfad von aufeinanderfolgenden Zahlen in aufsteigender Reihenfolge 1-(edge length)2 erstellt wird?Füllen 2D-Gitter mit einzelnem Pfad

Ich versuche, einen Hidato (alias Hidoku) Generator in JavaScript zu schreiben. Es ist nicht unbedingt die beste Sprache, um es zu schreiben, aber das ist es, was ich gerade benutze. Das Spielbrett ist zunächst nur teilweise gefüllt. Die einzigen angezeigten garantierten Nummern sind die erste und die letzte Nummer im Pfad. Die Idee des Spiels ist es, einen einzelnen Weg von Zahlen durch das Gitter (vertikal, horizontal oder diagonal) zu schaffen, so dass es eine fortlaufende aufsteigende Kette von Zahlen gibt. Die Kette kann sich aufgrund der Diagonalen überschneiden.

Ich bin auf der Platine Generation Teil stecken. Ein gültiges Gitter muss einen (einzelnen, nicht verzweigenden) Pfad mit fortlaufenden Nummern haben, die von 1 bis (grid size)2 gehen. Ich habe geschaut und geschaut, aber nichts gefunden, was mir hätte helfen können. Gibt es einen Wegverfolgungsalgorithmus, der ein 2D-Array mit einem einzigen Pfad füllen kann, der aus aufeinanderfolgenden Zahlen besteht?

Meine anfängliche, naive Methode bestand darin, ein 2D-Array mit Werten und Auslagerungswerten zu füllen, bis das Gitter ein gültiges Hidato-Puzzle war. Das würde ewig dauern und wäre sehr ineffizient, also habe ich diese Idee verschrottet.

Mein nächster Gedanke war, einen Backtracking Tracer zu verwenden, um das Raster mit aufeinanderfolgenden Werten zu füllen, aber ich bin mir nicht sicher, wie man einen solchen Tracer implementiert. Das Erzeugen eines Pfades ist einfach genug (wähle eine zufällige benachbarte Zelle und bewege dich dorthin, bis das 2D-Array voll ist), aber mein Problem hier ist die "Rückverfolgungs-Eigenschaft" des Algorithmus oder eine andere Möglichkeit, immer sicherzustellen, dass es ein zufälliges gibt Pfad der fortlaufenden Nummern im gesamten Netz. Ich dachte an einen Labyrinth-Tracer, aber das geht nicht um einzelne Pfade ohne Abzweigungen oder Sackgassen.

Wie kann ich von hier fortfahren? Sollte ich andere Optionen in Betracht ziehen als einen Pfad-Tracer oder einen ähnlichen Algorithmus?

Verwandte Fragen:

+0

Habe ich es richtig verstanden: Sie legen King Schachfigur auf eine zufällige Zelle des Schachbretts und besuchen Sie jede Zelle nur einmal. Dann nimmst du einen "Schnappschuss" von diesem Schachbrett und nummerierst alle Zellen mit Zahlen in der Durchlaufreihenfolge neu? – izogfif

+0

Ja, das ist richtig. Die Zellen müssen jedoch benachbart sein - ich kann nicht zufällig die Schachfigur herumspringen – Bojangles

+0

brauchen Sie Zellen, um die gemeinsame Kante zu haben? Wie die Schachfigur bewegt sich Rook, aber nur zu einer Zelle maximal? – izogfif

Antwort

7

Es stellt sich heraus, dass der lokale Suchalgorithmus für den Pfad Hamilton wegen Angluin und Valiant (1977) auf diese ziemlich gut, sogar obwohl es keinen Beweis für nicht zufällige Graphen gibt. Hier ist ein Beispielquadrat

99 98 101 103 105 106 129 132 133 140 135 136 
    97 100 102 104 107 130 131 128 141 134 139 137 
    95 96 109 108 112 122 127 126 125 142 143 138 
    80 94 110 111 121 113 123 124 40 39 36 144 
    79 81 93 120 116 115 114 48 41 38 37 35 
    78 82 92 90 119 117 47 46 49 42 33 34 
    77 83 84 91 89 118 45 58 43 50 32 31 
    76 1 85 87 88 60 59 44 57 51 30 28 
    75 2 86 4 6 63 61 54 52 56 29 27 
    73 74 3 7 5 64 62 53 55 22 24 26 
    72 69 67 8 65 11 12 14 15 23 21 25 
    70 71 68 66 9 10 13 16 17 18 19 20 

und der (etwas hastig geschriebene) Java-Code, der es gemacht hat.

+0

Vielen Dank für Ihre Hilfe. Könnten Sie den Algorithmus im Pseudocode zusammenfassen? – Bojangles

+0

Zu jedem Zeitpunkt gibt es einen einfachen Pfad zum "Sinken". Versuchen Sie, den Pfad von "Senke" mit einem zufälligen ausgehenden Bogen zu erweitern. Wenn sich der Kopf dieses Bogens nicht auf dem Pfad befindet, erweitern Sie den Pfad. Andernfalls vervollständigt der neue Bogen eine Schleife, deren Verbindungsknoten der Kopf dieses Bogens ist. Löschen Sie den anderen Schleifenbogen, der auf den Knotenpunkt trifft, richten Sie die Bögen in der Schleife neu aus und fahren Sie mit "Sinken" fort, das dem Anfang des gelöschten Bogens entspricht. Auf der Suche nach "Angluin Valiant Hamilton Cycle" finden Sie weitere Erklärungen. –