БлогNot. С++: заполнение матрицы "змейкой"

С++: заполнение матрицы "змейкой"

...довольно распространённый тип задач, и довольно плохо решаемый в инете. Требуется получить нечто вот такое (матрицу)

 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 [25082 просмотра]


теги: числа c++ алгоритм

К этой статье пока нет комментариев, Ваш будет первым