Advertisement
-Peer-

Заполнение двумерного массива по спирали по часовой стрелке…

Aug 26th, 2019
700
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.96 KB | None | 0 0
  1. /*
  2.  
  3. По данным числам n и m заполните двумерный массив размером n × m числами от 1 до n × m по спирали, выходящей из левого верхнего угла и закрученной по часовой стрелке.
  4.  
  5. Формат входных данных
  6.  
  7. Вводятся два числа n и m, не превышающие 100.
  8.  
  9. Формат выходных данных
  10.  
  11. Выведите полученный массив, отводя на вывод каждого элемента ровно 4 символа.
  12.  
  13. */
  14.  
  15. #include <iostream>
  16. #include <iomanip>
  17. #include <vector>
  18.  
  19. using namespace std;
  20.  
  21. const int DIM = 101;
  22.  
  23. int main ()
  24. {
  25.     int n, m, j, i;
  26.    
  27. // ВВОД РАЗМЕРОВ МАССИВА
  28.     cin >> n >> m;
  29.  
  30.     if (n > 0 && n < DIM && m > 0 && m < DIM) // контроль границ массива
  31.         {
  32. // СОЗДАНИЕ МАССИВА
  33.             vector <vector <int>> Grid (n);
  34.             for (i = 0; i < n; ++i)
  35.                 Grid[i].resize (m);
  36.  
  37. // ПОДГОТОВКА К ЗАПОЛНЕНИЮ МАССИВА
  38.             const bool Q = (n < m); // критерий сравнения размеров массива
  39.             int i0 = 0, iN = n - 1, jM = m - 1, Count = 0,  lim = (Q ? n : m);
  40.             const bool xQ = (bool)(lim & 1); // критерий нечётности: требуется ли заполнять центральную часть массива?
  41.             lim /= 2; // индекс центральной линии массива; с этого места значение lim неизменно!
  42. // другой индекс станет счётчиком цикла (формируется в переменной i0)
  43.  
  44.  
  45. // 1) ЗАПОЛНЕНИЕ МАССИВА ПРЯМОУГОЛЬНЫМИ КОЛЬЦАМИ
  46.             for (; i0 < lim; ++i0, --iN, --jM)
  47.                 {
  48.                     for (i = j = i0; j < jM; j++) // верхняя горизонталь кольца →слева направо
  49.                         {
  50.                             Grid[i][j] = ++Count;
  51.                         }
  52.                     for (; i < iN; i++) // правая вертикаль кольца ↓ сверху вниз
  53.                         {
  54.                             Grid[i][j] = ++Count;
  55.                         }
  56.                     for (; j > i0; j--) // нижняя горизонталь кольца ← справа налево
  57.                         {
  58.                             Grid[i][j] = ++Count;
  59.                         }
  60.                     for (; i > i0; i--) // левая вертикаль кольца ↑ снизу вверх
  61.                         {
  62.                             Grid[i][j] = ++Count;
  63.                         }
  64.                 }
  65.  
  66. // 2) ЗАПОЛНЕНИЕ ЦЕНТРАЛЬНОЙ ЧАСТИ МАССИВА
  67.             if (xQ) // только по необходимости…
  68.                 {
  69.                     if (Q)   // если n меньше m, то слева направо…
  70.                         {
  71.                             for (; i0 <= jM; ++i0)
  72.                                 {
  73.                                     Grid[lim][i0] = ++Count;
  74.                                 }
  75.                         }
  76.                     else   // …иначе сверху вниз
  77.                         {
  78.                             for (; i0 <= iN; ++i0)
  79.                                 {
  80.                                     Grid[i0][lim] = ++Count;
  81.                                 }
  82.                         }
  83.                 }
  84. // ВЫВОД МАССИВА
  85.             for (i = 0; i < n; i++)
  86.                 {
  87.                     cout << endl;
  88.                     for (j = 0; j < m; j++)
  89.                         {
  90.                             cout << setw (4) << Grid [i][j];
  91.                         }
  92.                 }
  93.  
  94.         }
  95.     return 0;
  96. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement