Matrix und Algorithmus "Spirale"

8

Ich wollte fragen, ob da ein Algorithmus bereit ist, der mir das erlaubt: Ich habe eine Matrix m (col) x n (Zeile) mit m x n Elementen. Ich möchte diesem Element eine Position geben, die von der Mitte ausgeht und sich als eine Spirale dreht, zum Beispiel für eine Matrix 3x3. Ich habe 9 so definierte Elemente:

%Vor%

oder für eine una Matrix 4 x 3 Ich habe 12 Elemente, definiere:

%Vor%

oder wieder, eine Matrix 5x2 Ich habe 10 Elemente so definiert:

%Vor%

usw. Ich habe im Grunde gelöst, ein Array von ganzen Zahlen von m x n Elementen zu definieren und den Wert manuell zu laden, aber im Allgemeinen wie die Matrix, die vom Algorithmus automatisch erzeugt wird. Danke, wer mir helfen kann, so etwas zu finden, vielen Dank.

AKTUALISIEREN

Dieser Code, tun genau über ich will, aber nicht in Delphi; nur ich brauche den Anfang von 1 und nicht von 0. Wichtig für mich ist, dass es für alle Matrizen m x n gültig ist. Wer hilft mir, es in Delphi zu übersetzen?

%Vor%

Nochmals vielen Dank.

    
Marcello Impastato 06.01.2012, 12:02
quelle

4 Antworten

4

Basiert auf dem klassischen Spiralalgorithmus . unterstützende nicht-quadratische Matrix:

%Vor%

3 x 3:

%Vor%

4 x 3:

%Vor%

2 x 5:

%Vor%     
kobik 07.01.2012, 14:52
quelle
1

Na los !!! Nach 30 Jahren Syntaxfehler ...

Auf ideone.com habe ich es mit einigen Tests getestet und es scheint gut zu funktionieren. Ich denke du kannst die Ausgabe dort immer noch sehen und selbst ausführen ...

Ich habe einige Kommentare in den Code geschrieben. Genug, um das meiste zu verstehen. Das Hauptnavigationssystem ist ein wenig schwieriger zu erklären. Kurz gesagt, eine Spirale zu machen geht in die erste Richtung 1 Mal, Sekunde 1 Mal, 3 Mal 2 Mal, 4 Mal 2 Mal, 5 Mal 3 Mal, 3, 4, 4, 5, 5 und so weiter. Ich verwende das, was ich seed und step genannt habe, um dieses Verhalten zu erhalten.

%Vor%

Wenn Sie das wirklich brauchen, um Textspiralen zu drucken, lasse ich Sie die Zahlen ausrichten. Packen Sie sie einfach mit Leerzeichen.

BEARBEITEN:

Ich habe vergessen ... Um es mit ideone arbeiten zu lassen, setze ich die Parameter auf 2 Zeilen als Eingabe. m, dann n.

Zum Beispiel:

%Vor%

ergibt

%Vor%     
Joanis 07.01.2012 00:55
quelle
-1

Hier ist die kommentierte JavaScript-Implementierung für das, was Sie erreichen möchten.

%Vor%

Der Code ist nicht der effizienteste, weil er die Spirale naiv durchläuft, ohne zuerst zu prüfen, ob der Ort, auf dem er läuft, gültig ist. Es überprüft nur die Gültigkeit des aktuellen Standorts, bevor es versucht, den Wert festzulegen.

    
Louis Ricci 06.01.2012 18:36
quelle
-1

Auch wenn die Frage bereits beantwortet ist, ist dies eine alternative Lösung (wohl einfacher). Die Lösung ist in Python (mit numpy für bidimendional Arrays), kann aber leicht portiert werden.

Die Grundidee ist es, die Tatsache zu benutzen, dass die Anzahl der Schritte bekannt ist (m * n) als Endbedingung, und um das nächste Element der Schleife bei jeder Iteration richtig zu berechnen:

%Vor%

Und hier einige Ausgaben:

%Vor%     
joanpau 11.12.2014 12:59
quelle