Advertisement
Korotkodul

ИТМО. Матрица. Спираль

Nov 26th, 2021
98
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.65 KB | None | 0 0
  1. #include <iostream>
  2. #include <cmath>
  3. #include <vector>
  4. #include <set>
  5. #include <string>
  6. #include <algorithm>
  7. using namespace std;
  8. using ll = long long;
  9. void cv(vector <int> v){
  10.     for (auto x: v) cout<<x<<' ';
  11.     cout<<'\n';
  12. }
  13.  
  14. vector <int> dx = {0, 1, 0, -1};
  15. vector <int> dy = {1, 0, -1, 0};
  16.  
  17. bool gd(int i, int j, vector <vector <int> > &ds){
  18.     int N = ds.size();
  19.     bool can = 1;
  20.     if (i < 0 || i >= N || j < 0 || j >= N){
  21.         can = 0;
  22.     }
  23.     else if (ds[i][j] != -1) can = 0;
  24.     return can;
  25. }
  26.  
  27. //если 585 находится на предпоследнем элементе диагонали, то выводим ответ
  28. //если 585 уже точно не находится на предпоследнем элементе диагонали, то прекращаем работу
  29. int f(int N){
  30.     vector <vector <int> > ds(N, vector <int> (N, -1));
  31.     int d = 1;
  32.     int x = 0, y = 0;
  33.     int dir = 0;
  34.     int res = -1;
  35.     //1 - еще не нашли
  36.     //2 - нашли
  37.     //3 -- уже точно нельзя найти
  38.     for (int i = 0; i < N*N;++i){
  39.         ds[x][y] = d;
  40.         d++;
  41.         if (!gd(x + dx[dir], y + dy[dir], ds)){
  42.             dir = (dir+1) % 4;
  43.         }
  44.         x += dx[dir];
  45.         y += dy[dir];
  46.         if (x < N - 2 && y < N - 2 && d == 585) {
  47.                 break;
  48.                 res = 3;
  49.         }
  50.         if (x == N - 2 && y == N - 2){
  51.                 if (d == 585) res = 2;
  52.                 else res = 1;
  53.                 break;
  54.         }
  55.     }
  56.     return res;
  57. }
  58.  
  59. //вывести матрицу -- чтобы проверить, насколько правильный алгоритм обхода матрицы
  60. void F(int N){
  61.     vector <vector <int> > ds(N, vector <int> (N, -1));
  62.     int d = 1;
  63.     int x = 0, y = 0;
  64.     int dir = 0;
  65.     int res = -1;
  66.     //1 - еще не нашли
  67.     //2 - нашли
  68.     //3 -- уже точно нельзя найти
  69.     for (int i = 0; i < N*N;++i){
  70.         ds[x][y] = d;
  71.         d++;
  72.         if (!gd(x + dx[dir], y + dy[dir], ds)){
  73.             dir = (dir+1) % 4;
  74.         }
  75.         x += dx[dir];
  76.         y += dy[dir];
  77.     }
  78.     for (auto x: ds){
  79.         for (auto y: x){
  80.             cout<<y<<' ';
  81.         }cout<<'\n';
  82.     }
  83. }
  84.  
  85.  
  86.  
  87. int main()
  88. {
  89.     /*int N;
  90.     cin>>N;
  91.     F(N);*/
  92.     int cnt = 1, ans = -1;
  93.     bool can = 0;
  94.     while (true){
  95.         if (f(cnt) == 2){
  96.             can = 1;
  97.             ans = cnt;
  98.             break;
  99.         }
  100.         else if (f(cnt) == 3){
  101.             break;
  102.         }
  103.         cnt++;
  104.     }
  105.     if (can) cout<<ans<<'\n';
  106.     else cout<<"NULL\n";
  107. }
  108.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement