2010-01-21 11 views

Antwort

22

Ich erinnere mich, das zu schreiben. Ich denke, für eine rechteckige Matrix Sie ein paar kleine Änderungen brauchen würde und eine weitere Zeile von unverständlichen Unsinn:

#include <stdio.h> 

int main() 
{ 
    int x[3][4] = { 1, 2, 3, 4, 
        5, 6, 7, 8, 
        9, 10, 11, 12}; 
    int m = 3; 
    int n = 4; 
    for (int slice = 0; slice < m + n - 1; ++slice) { 
     printf("Slice %d: ", slice); 
     int z1 = slice < n ? 0 : slice - n + 1; 
     int z2 = slice < m ? 0 : slice - m + 1; 
     for (int j = slice - z2; j >= z1; --j) { 
       printf("%d ", x[j][slice - j]); 
     } 
     printf("\n"); 
    } 
    return 0; 
} 

Ausgang:

Slice 0: 1 
Slice 1: 5 2 
Slice 2: 9 6 3 
Slice 3: 10 7 4 
Slice 4: 11 8 
Slice 5: 12 

Um kurz zu erklären, wie es funktioniert, jede Scheibe ist eine diagonale ausgehend von der ersten Spalte, schräg nach oben rechts und endend in der ersten Zeile (ursprünglich links unten, aber jetzt aufgrund eines Kommentars vom Poster getauscht).

z2 gibt an, wie viele Elemente übersprungen werden müssen, bevor die erste Nummer gedruckt werden soll. Dies ist Null für die ersten m Schichten und erhöht sich dann für jede verbleibende Schicht um eins. z1 ist, wie viele Elemente am Ende übersprungen werden sollen, wobei wieder bei Null für die ersten m Schichten begonnen wird und für die verbleibenden Scheiben um eins erhöht wird.

+0

Ja, das wollte ich. Aber ... Was ich eigentlich brauche, ist Traverse Rectangular Matrix in ANTI-Diagonalstreifen. :) Ich habe versucht, die Indizes in der Antwort zu tauschen, die Sie für die quadratische Matrix gegeben haben, und ich dachte, ich könnte das gleiche Prinzip hier anwenden - nur um die Indizes zu tauschen und eine antidiagonale Traversierung zu erhalten. Für eine rechteckige Matrix wird es jedoch nicht funktionieren. Also, sollte ich jetzt noch eine Frage für ANTI-Diagonale rechteckige Traversal stellen? Danke für die Antwort :) – misaizdaleka

+1

Ich bin mir nicht ganz sicher, was Sie mit Anti-Diagonale meinen. Aktualisieren Ihrer Frage würde helfen. Ich denke, was Sie tun müssen, ist die Y-Koordinaten zu spiegeln, wenn Sie die Array-Werte lesen, aber x unverändert lassen, dh 'x [m - j - 1] [slice - j]' anstelle von 'x [j] [slice - j] '. Das gibt [9], [10,5], [11,6,1] usw. ... Ist das was du willst? –

+0

Sorry, mein Fehler nochmal ... ich war nicht genau. Nein, ich brauche dieselbe Durchquerung, aber nicht wie [1], [2,5], [3,6,9], sondern wie [1], [5,2], [9,6,3], usw. Danke nochmal. – misaizdaleka

Verwandte Themen