Траверса прямоугольной матрицы в диагональных полосах - PullRequest
10 голосов
/ 21 января 2010

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

Спасибо.

1 Ответ

22 голосов
/ 22 января 2010

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

#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 срезов и увеличиваясь на один для остальных срезов.

...