Wie man eine ulam Spirale in Java-Stack-Überlauf machen
So verbrachte ich ein paar Stunden heute Logik zu schreiben, und es in dem Code drehen, aber ich bin ganz an dieser Stelle stecken, und ich weiß nicht, was zu tun ist. Ich habe für ein paar Monate in der Java-Programmierung jetzt nur worden, so dass die gesamte „logische“ Mentalität ist noch nicht ganz so weit. Kann mir jemand durch die Logik denken helfen, wie eine ulam Spirale in Java erstellen?
Du bist nicht klar, was mit Ihrem Code falsch ist; es wäre besser, zu sein persönliches Vertrauen zu wissen, was das Verhalten Sie wollen und welches Verhalten Sie beobachten und wo speziell Sie sie passen bei der Herstellung stecken.
Aber ich schlage vor, dass Sie durch die Arbeit an Drucken ein einfach Anzahl Spiralmuster zu beginnen. Vom Wikipedia-Artikel auf der Ulam Spirale. die grundlegende Spirale sieht wie folgt aus:

Eine kleine Studie der Spirale zeigt einige interessante Eigenschaften. Ausgehend von der Mitte (wobei „1“ gedruckt wird), gehe nach unten und nach rechts auf dem Diagonalen Sie alle ungeraden Plätze in Folge zu sehen. (Jede Zeile speichert die letzte Vergangenheit des Platzes erstreckt, einschließen (2k + 1) 2 +1.) Ebenso steigen und nach links auf der Diagonalen Sie alle Zahlen der Form zu sehen (2k) 2 + 1 ( eins plus die geraden Quadrate). Sie können diese Eigenschaften verwenden, um die Grenzen von jeder Zeile der Spirale zu berechnen.
Lassen Sie uns den letzteren Ansatz. Wir können die folgenden Eigenschaften für Zeile r beachten:
- Die Zahl auf der Hauptdiagonalen auf Zeile R (2R) 2 +1. Dies ist bei den Koordinaten (r, r) von der Mitte.
- es gibt 1-2r angeschlossenen Zahlen in Folge auf Zeile R (man erinnere sich, dass r <= 0), going left-to-right in descending order from cell (r, r) through cell (-r, r). (For example, for r=-1, the sequence is "5—4—3" at cells (-1, -1), (0, -1), (1, -1).)
- gibt es 2N + 1 Zahl auf jeder Zeile, die Blätter (N + r) Zahlen links und rechts von der Sequenz verbunden ist.
- für jede Zelle, (c, r) auf der Reihe r mit c < r (≤ 0), the number is obtained by adding r-c to the number at cell (c, c) (which, from above, is (2c> 2 + 1).
- für jede Zelle, (c, r) auf der Reihe r mit c> r ist die Anzahl durch Zusatz von c + r für die Anzahl an Zellen (c, c) erhalten wird (die sich von der ersten Regel unten ist (2c + 1 2)).
- Die Zahl auf der Hauptdiagonale auf der Reihe r (2r + 1) 2.
- für r < N, there are 2r+2 connected numbers in sequence on row r, in going left-to-right in ascending order from cell (-r, r) through cell (r, r+1). (For example, "7—8—9—10".) On the last row (r=N), there are only 2N+1 connected numbers, since that's where we truncate the spiral.
- gibt es 2N + 1 Zahl auf jeder Zeile, die Blätter (N-R) Zahlen links und (N-r-1) Zahlen rechts von der Sequenz verbunden ist.
- für jede Zelle, (c, r) auf der Reihe r mit c < -r, the number is obtained by adding r-c to the number at cell (c, c).
- für jede Zelle, (c, r) auf der Reihe r mit c> r + 1, wird die Anzahl durch Zusatz von C-R auf die Anzahl an Zellen (c, c) erhalten.
Aus diesen Regeln sollten Sie einen Algorithmus zu erstellen Lage sein, eine Spirale für alle N auszudrucken> 0 Ich habe nicht das Problem der vertikalen Verbindungen zwischen den Zellen adressiert, aber Sie können eine ähnliche Analyse anwenden, um die Regeln zu entdecken für sie zeichnen . Für die richtige Formatierung, sollten Sie eine feste Breite für jede Zelle holen (was offensichtlich sollte für die größte Zahl breit genug sein, (2N + 1) 2).