Недавно тут пришлось тряхнуть стариной, а именно написать код который выводит диагонали (в простейшем случае квадратной матрицы) от a(11) до a(33), соответственно, сверху вниз, слева направо.
Пример достаточно эффективной реализации описан тут (stackoverflow.com)
Решение задачи «в лоб»
#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 также очень приветствуются.
Так как принцип обхода элементов матрицы я вроде бы понял, но ощущения неуклюжести от применяемых методов меня не покинуло.
Вот запостил эту фигню сюда :-)






