2010-01-21 6 views

Répondre

22

Je me souviens avoir écrit ça. Je pense que pour une matrice rectangulaire, vous aurez besoin de quelques changements mineurs et une ligne supplémentaire de non-sens incompréhensible:

#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; 
} 

Sortie:

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

Pour expliquer brièvement comment cela fonctionne, chaque tranche est une diagonale en partant de la première colonne, en allant en diagonale vers la droite et en terminant sur la première rangée (initialement en bas à gauche, mais maintenant échangé à la suite d'un commentaire de l'affiche). Z2 indique combien d'éléments doivent être ignorés avant d'imprimer le premier nombre. Ceci est nul pour les premières tranches m puis augmente de un pour chaque tranche restante. z1 correspond au nombre d'éléments à ignorer à la fin, en commençant par zéro pour les premières tranches m et en augmentant d'une unité pour les autres tranches.

+0

Oui, c'est ce que je voulais. Mais ... Ce dont j'ai vraiment besoin, c'est de Traverse Rectangular Matrix dans les bandes ANTI-Diagonal. :) J'ai essayé d'échanger les indices dans la réponse que vous avez donnée pour la matrice carrée, et j'ai pensé que je pourrais appliquer le même principe ici - juste pour échanger les indices, et pour obtenir la traversée anti-diagonale. Cependant, pour une matrice rectangulaire, cela ne fonctionnera pas. Alors, dois-je maintenant poser une question de plus pour la traversée rectangulaire ANTI-diagonale ??? Merci pour la réponse :) – misaizdaleka

+1

Je ne suis pas tout à fait sûr de ce que vous voulez dire par anti-diagonale. Mettre à jour votre question aiderait. Je pense que ce que vous devez faire est d'inverser les coordonnées y quand vous lisez les valeurs du tableau mais laissez inchangé x, ie 'x [m - j - 1] [tranche - j]' au lieu de 'x [j] [tranche - j] '. Cela donne [9], [10,5], [11,6,1], etc ... Est-ce que c'est ce que tu veux? –

+0

Désolé, mon erreur encore ... Je n'étais pas précis. Non, j'ai besoin de la même traversée, mais pas comme [1], [2,5], [3,6,9], mais comme [1], [5,2], [9,6,3], etc. Merci encore. – misaizdaleka

Questions connexes