Advertisement
AlexG2230954

Untitled

Mar 13th, 2023 (edited)
773
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.61 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3.  
  4. using namespace std;
  5.  
  6.  
  7. // Типа вектор с координатами i, j
  8. // i, j представляют собой индексы строк и столбцо
  9. // т. е. {0, 1} будет означать, что надо сдвинуться на 0 вниз (по строкам)
  10. // и на 1 вправо (по столбцам)
  11. struct Position
  12. {
  13.     int i, j;
  14. };
  15.  
  16.  
  17. // Поворот вектора на 90 градусов по часовой стрелке
  18. Position rotate(Position v)
  19. {
  20.     return {v.j, -v.i};
  21. }
  22.  
  23.  
  24. int main()
  25. {
  26.     vector<vector<int>> matr; // двумерный массив, который буду выводить
  27.     vector<int> values; // массив с значениями, которые будут пихаться в matr
  28.     Position pos; // курсор. Показывает, куда надо записывать очередное значение из values
  29.     Position direction; // направление. Показывает, куда смещаться на новую позицию
  30.     int n; // количество значений
  31.  
  32.     cout << "n: ";
  33.     cin >> n;
  34.  
  35.     matr = vector<vector<int>>(n, vector<int>(n, -1)); // -1 - элемент пустой, в него можно занести значение
  36.     values = vector<int>(n * n);
  37.  
  38.     cout << "values: ";
  39.     for(int & el : values)
  40.         cin >> el;
  41.  
  42.     pos = {0, -1}; // -1 чтобы не менять дальше код в цикле
  43.     direction = {0, 1}; // описано выше (см. Position)
  44.  
  45.     // i - индекс элемента, который будем ложить в matr из values
  46.     for(int i = 0; i < n * n; i++)
  47.     {
  48.         Position newPos = {pos.i + direction.i, pos.j + direction.j}; // кандидат на новую позицию
  49.  
  50.         // если новая позиция выходит за границы, или этот элемент в matr уже занят
  51.         if(newPos.i >= n || newPos.j >= n || matr[newPos.i][newPos.j] != -1)
  52.         {
  53.             direction = rotate(direction); // направление поворачиваем на 90 градусов
  54.             newPos = {pos.i + direction.i, pos.j + direction.j}; // пересчитываем новую позицию
  55.         }
  56.  
  57.         matr[newPos.i][newPos.j] = values[i]; // записываем значение из values
  58.         pos = newPos; // обновляем текущую позицию
  59.     }
  60.  
  61.     // вывод получившегося двумерного массива на экран
  62.     for(int i = 0; i < n; i++)
  63.     {
  64.         for(int j = 0; j < n; j++)
  65.             cout << matr[i][j] << " ";
  66.         cout << endl;
  67.     }
  68. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement