Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*
- По данным числам n и m заполните двумерный массив размером n × m числами от 1 до n × m по спирали, выходящей из левого верхнего угла и закрученной по часовой стрелке.
- Формат входных данных
- Вводятся два числа n и m, не превышающие 100.
- Формат выходных данных
- Выведите полученный массив, отводя на вывод каждого элемента ровно 4 символа.
- */
- #include <iostream>
- #include <iomanip>
- #include <vector>
- using namespace std;
- const int DIM = 101;
- int main ()
- {
- int n, m, j, i;
- // ВВОД РАЗМЕРОВ МАССИВА
- cin >> n >> m;
- if (n > 0 && n < DIM && m > 0 && m < DIM) // контроль границ массива
- {
- // СОЗДАНИЕ МАССИВА
- vector <vector <int>> Grid (n);
- for (i = 0; i < n; ++i)
- Grid[i].resize (m);
- // ПОДГОТОВКА К ЗАПОЛНЕНИЮ МАССИВА
- const bool Q = (n < m); // критерий сравнения размеров массива
- int i0 = 0, iN = n - 1, jM = m - 1, Count = 0, lim = (Q ? n : m);
- const bool xQ = (bool)(lim & 1); // критерий нечётности: требуется ли заполнять центральную часть массива?
- lim /= 2; // индекс центральной линии массива; с этого места значение lim неизменно!
- // другой индекс станет счётчиком цикла (формируется в переменной i0)
- // 1) ЗАПОЛНЕНИЕ МАССИВА ПРЯМОУГОЛЬНЫМИ КОЛЬЦАМИ
- for (; i0 < lim; ++i0, --iN, --jM)
- {
- for (i = j = i0; j < jM; j++) // верхняя горизонталь кольца →слева направо
- {
- Grid[i][j] = ++Count;
- }
- for (; i < iN; i++) // правая вертикаль кольца ↓ сверху вниз
- {
- Grid[i][j] = ++Count;
- }
- for (; j > i0; j--) // нижняя горизонталь кольца ← справа налево
- {
- Grid[i][j] = ++Count;
- }
- for (; i > i0; i--) // левая вертикаль кольца ↑ снизу вверх
- {
- Grid[i][j] = ++Count;
- }
- }
- // 2) ЗАПОЛНЕНИЕ ЦЕНТРАЛЬНОЙ ЧАСТИ МАССИВА
- if (xQ) // только по необходимости…
- {
- if (Q) // если n меньше m, то слева направо…
- {
- for (; i0 <= jM; ++i0)
- {
- Grid[lim][i0] = ++Count;
- }
- }
- else // …иначе сверху вниз
- {
- for (; i0 <= iN; ++i0)
- {
- Grid[i0][lim] = ++Count;
- }
- }
- }
- // ВЫВОД МАССИВА
- for (i = 0; i < n; i++)
- {
- cout << endl;
- for (j = 0; j < m; j++)
- {
- cout << setw (4) << Grid [i][j];
- }
- }
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement