С++: заполнение матрицы "змейкой"
...довольно распространённый тип задач, и довольно плохо решаемый в инете. Требуется получить нечто вот такое (матрицу)
0 1 2 3 4 5 11 10 9 8 7 6 12 13 14 15 16 17 23 22 21 20 19 18
или такое
0 7 8 15 16 23 1 6 9 14 17 22 2 5 10 13 18 21 3 4 11 12 19 20
Размерность заполняемой матрицы произвольна. Почему плохо решаемый? Потому что начинают вводить какие-то дополнительные счётчики и условия там, где достаточно "сквозного" номера элемента в цепочке (обозначен k
) и несложной зависимости значения элемента a[i][j]
от размерности матрицы и чётности или нечётности номера строки/столбца.
Первое заполнение делает функция rows_by_snake
, второе - cols_by_snake
, вот полный листинг примера:
#include <iostream> #include <iomanip> void rows_by_snake(int n, int m, int** a) { int i, j, k = 0; for (i = 0; i < n; i++) for (j = 0; j < m; j++) { a[i][j] = (i % 2 ? (i + 1) * m - j - 1 : k); k++; } } void cols_by_snake(int n, int m, int** a) { int i, j, k = 0; for (j = 0; j < m; j++) for (i = 0; i < n; i++) { a[i][j] = (j % 2 ? (j + 1) * n - i - 1 : k); k++; } } void output_matrix(int n, int m, int** a) { for (int i = 0; i < n; i++) { std::cout << std::endl; for (int j = 0; j < m; j++) std::cout << std::setw(3) << a[i][j] ; } } int main() { const int n = 4, m = 6; int** a, i; a = new int* [n]; for (i = 0; i < n; i++) a[i] = new int[m]; rows_by_snake(n, m, a); output_matrix(n, m, a); cols_by_snake(n, m, a); output_matrix(n, m, a); return 0; }
14.11.2013, 18:41 [25305 просмотров]