2010-01-21 12 views

Respuesta

22

Recuerdo escribir eso. Creo que para una matriz rectangular que había necesidad de algunos cambios menores y una línea más del disparate incomprensible:

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

Salida:

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

explicar brevemente cómo funciona, cada rebanada es una diagonal comenzando desde la primera columna, yendo diagonalmente arriba a la derecha y terminando en la primera fila (originalmente abajo a la izquierda, pero ahora se intercambia como resultado de un comentario del cartel).

z2 indica cuántos elementos se deben omitir antes de que se imprima el primer número. Esto es cero para los primeros m cortes y luego aumenta en uno para cada segmento restante. z1 es la cantidad de elementos que se deben omitir al final, nuevamente comenzando en cero para los primeros m cortes, y aumentando en uno para los sectores restantes.

+0

Sí, eso es lo que quería. Pero ... Lo que realmente necesito es una Matriz Reversa Traverse en tiras ANTI-Diagonales. :) Intenté intercambiar los índices en la respuesta que me dieron para la matriz cuadrada, y pensé que podría aplicar el mismo principio aquí, solo para intercambiar los índices y obtener un recorrido antidiabético. Sin embargo, para la matriz rectangular no funcionará. Entonces, ¿debería hacer ahora una pregunta más para el recorrido rectangular ANTI-diagonal? Gracias por la respuesta :) – misaizdaleka

+1

No estoy del todo seguro de lo que quiere decir con anti-diagonal. La actualización de su pregunta ayudaría. Creo que lo que tienes que hacer es voltear las coordenadas y cuando leas los valores de la matriz, pero no cambies x, es decir, 'x [m - j - 1] [slice - j]' en lugar de 'x [j] [slice - j] '. Esto da [9], [10,5], [11,6,1], etc. ¿Es eso lo que quieres? –

+0

Lo siento, mi error otra vez ... No era preciso. No, necesito el mismo recorrido, pero no voy como [1], [2,5], [3,6,9], pero como [1], [5,2], [9,6,3], etc. Gracias de nuevo. – misaizdaleka