2010-01-21 6 views
9

Мне нужно то же самое сделано here, но для работы с любой матрицей, а не только с квадратной. Кроме того, направление обхода должно быть противоположным. Я попытался отредактировать код, который я нашел там, но не мог понять.Траверс прямоугольной матрицы в диагональных полосах

Спасибо.

ответ

22

Я помню, как писал это. Я думаю, что для прямоугольной матрицы вы должны были бы несколько незначительных изменений и еще одну линии непонятной ерунды:

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

Выход:

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

Чтобы кратко объяснить, как это работает, каждый кусочек диагональный начиная с первого столбца, идущего по диагонали вверх-вправо и заканчивая в первой строке (первоначально слева вниз, но теперь заменяемой в результате комментария от плаката).

z2 указывает, сколько предметов должно быть пропущено до того, как будет напечатано первое число. Это значение равно нулю для первых m срезов, а затем увеличивается на единицу для каждого оставшегося фрагмента. z1 - количество элементов должно быть пропущено в конце, снова начинающееся с нуля для первых m срезов и увеличивающее на единицу для оставшихся фрагментов.

+0

Да, это то, что я хотел. Но ... На самом деле мне нужна прямоугольная матрица Traverse в ANTI-Diagonal strip. :) Я попытался поменять индексы в ответе, который вы дали для квадратной матрицы, и я подумал, что могу применить тот же принцип здесь - просто поменять индексы и получить антидиагональный обход. Однако для прямоугольной матрицы это не сработает. Итак, теперь я должен задать еще один вопрос для ANTI-диагонального прямоугольного обхода ??? Спасибо за ответ :) – misaizdaleka

+1

Я не совсем уверен, что вы подразумеваете под антидиагональным. Обновление вашего вопроса поможет. Я думаю, что вам нужно перевернуть y-координаты, когда вы читаете значения массива, но оставляете x неизменным, т. Е. 'X [m - j - 1] [slice - j]' вместо 'x [j] [slice - J] '. Это дает [9], [10,5], [11,6,1] и т. Д. Это то, что вы хотите? –

+0

Извините, моя ошибка снова ... Я не был точен. Нет, мне нужен тот же обход, но не такой, как [1], [2,5], [3,6,9], но, как [1], [5,2], [9,6,3] и т.д. Еще раз спасибо. – misaizdaleka

Смежные вопросы