Недавно тут пришлось тряхнуть стариной, а именно написать код который выводит диагонали (в простейшем случае квадратной матрицы) от a(11) до a(33), соответственно, сверху вниз, слева направо.
Пример достаточно эффективной реализации описан тут
Решение задачи «в лоб»
#include <stdio.h>
int main(){
int row_count, col_count, cur_row, cur_col;
int matrix[3][3] = { 1, 2, 3,
4, 5, 6,
7, 8, 9};
printf("Printing matrix diagonally\n");
for(col_count = 0; col_count < 3; col_count++){
cur_col = col_count; cur_row = 0;
for(;cur_col >= 0 && cur_row < 3; cur_col--, cur_row++){
printf("%d ", matrix[cur_row][cur_col]);
}
printf("\n");
}
for(row_count = 1; row_count < 3; row_count++){
cur_col = 2; cur_row = row_count;
for(;cur_col >= 0 && cur_row < 3; cur_col--, cur_row++){
printf("%d ", matrix[cur_row][cur_col]);
}
printf("\n");
}
getchar();
return 0;
}
Но все же, господа, хочется, чтобы код был читабельным и эффективным. А посему, версии на Си++ с обертками на основе std::vector также очень приветствуются.
Так как принцип обхода элементов матрицы я вроде бы понял, но ощущения неуклюжести от применяемых методов меня не покинуло.
Вот запостил эту фигню сюда :-)