Я помню, как писал это. Я думаю, что для прямоугольной матрицы вы должны были бы несколько незначительных изменений и еще одну линии непонятной ерунды:
#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 срезов и увеличивающее на единицу для оставшихся фрагментов.
Да, это то, что я хотел. Но ... На самом деле мне нужна прямоугольная матрица Traverse в ANTI-Diagonal strip. :) Я попытался поменять индексы в ответе, который вы дали для квадратной матрицы, и я подумал, что могу применить тот же принцип здесь - просто поменять индексы и получить антидиагональный обход. Однако для прямоугольной матрицы это не сработает. Итак, теперь я должен задать еще один вопрос для ANTI-диагонального прямоугольного обхода ??? Спасибо за ответ :) – misaizdaleka
Я не совсем уверен, что вы подразумеваете под антидиагональным. Обновление вашего вопроса поможет. Я думаю, что вам нужно перевернуть y-координаты, когда вы читаете значения массива, но оставляете x неизменным, т. Е. 'X [m - j - 1] [slice - j]' вместо 'x [j] [slice - J] '. Это дает [9], [10,5], [11,6,1] и т. Д. Это то, что вы хотите? –
Извините, моя ошибка снова ... Я не был точен. Нет, мне нужен тот же обход, но не такой, как [1], [2,5], [3,6,9], но, как [1], [5,2], [9,6,3] и т.д. Еще раз спасибо. – misaizdaleka