2017-05-19 3 views
0

Ich habe Probleme mit meiner Aufgabe und benötige Hilfe.C - spiralförmige Traversierung des 2D-Arrays nach außen (von der Mitte ausgehend) und im Uhrzeigersinn

Das Programm, das ich code muss durchlaufen (genauer - füllen mit natürlichen Zahlen von 1 bis N^2, aber der Traversalgorithmus ist, was ich mit kämpfen) ein 2D-Array A [N] [N], wo N ist ungerade (1,3,5,7 ...), ausgehend von der Mitte (A [N/2] [N/2]) und bewegt sich spiralförmig und im Uhrzeigersinn.

Beispiel (N = 5):

25 10 11 12 13 
24 9 2 3 14 
23 8 1 4 15 
22 7 6 5 16 
21 20 19 18 17 

Ich sehe das Muster: center = 1; 1xUP, 1xRIGHT, 2xDOWN, 2xLEFT, 3xUP, 3XRIGHT usw.

Wie kann ich diesen Algorithmus mit Schleifen implementieren? Die Zeit tickt und ich stecke hier ...

Wir freuen uns, einige Vorschläge zu lesen und Hilfe zu erhalten.

Vielen Dank!

+0

Ja, ich habe das gesehen, aber wie soll ich den Code bearbeiten, so dass er von der Mitte ausgeht, vertikal nach OBEN geht und dann spiralförmig und im Uhrzeigersinn weitergeht? Das ist der Kampf. EDIT: Ich habe auch einen Code für Spirale und im Uhrzeigersinn Traversal, beginnend mit Indizes [0] [0] (der Anfang der Matrix). Ich arbeite gerade daran, so dass es von innen nach außen geht. Ich kann diesen Code hier einfügen und wenn möglich: gib mir Tipps, wie ich es überarbeiten kann. – Waterfalse

+0

Sie können dafür auch den quadratischen Kern verwenden (statt zirkulär 'cos, sin') siehe [Drehen Sie eine diagonale Linie in einem 2D 3 x 3 Gitter - Rotationsmatrix benötigt?] (Http://stackoverflow.com/a/40355825/ 2521214) Also einfach Quadrate von der Mitte zum äußeren Rand der Matrix ... ähnlich dem Rendern konzentrischer Kreise – Spektre

Antwort

0

können Sie gleiche Implementierung verwenden und die Richtung ändert ersten Schritt hier: Print 2-D Array in clockwise expanding spiral from center

int x = 0; // current position; x 
int y = 0; // current position; y 
int d = 0; // current direction; 0=RIGHT, 1=DOWN, 2=LEFT, 3=UP 
int c = 0; // counter 
int s = 1; // chain size 

int d - ist Stromrichtung; ändern Sie es in 3.

+1

Danke, @knst! Ich mache es jetzt so und es funktioniert fast. Benötigt etwas Arbeit, damit es richtig funktioniert. Werde hier schreiben, wenn ich fertig bin! – Waterfalse

+0

Nun, ich habe es so gemacht, aber das einzige Problem ist, dass das letzte Element aus dem Traversal (Element mit den Koordinaten [0] [0]) nicht erreicht wird. Zum Beispiel: N = 5, füllt die Matrix wie gewünscht, aber das letzte Element (Matrix [0] [0]) hat einen zufälligen Wert anstelle von N^2 = 25. – Waterfalse

+0

Darf ich fragen, was eigentlich diese Fragmente (für's) machst: für (int k = 1; k <= (Größe-1); k ++) { für (int j = 0; j <(k <(Größe-1) 2: 3); j ++) Wofür werden sie genau verwendet? – Waterfalse

Verwandte Themen