Iamtui1010

mtwalk

Nov 9th, 2021
99
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.96 KB | None | 0 0
  1. //#include<bits/stdc++.h>
  2. #include<iostream>
  3. #include<fstream>
  4. #include<vector>
  5. #include<algorithm>
  6. #include<cstring>
  7.  
  8. #define long short
  9. #define nln '\n'
  10.  
  11. const long N = 111;
  12.  
  13. using namespace std;
  14.  
  15. // Global variables: f1, f2, n, mat
  16.  
  17. fstream f1, f2;
  18.  
  19. inline void openf()
  20. {
  21.     f1.open("mtwalk.inp", ios:: in);
  22.     f2.open("mtwalk.out", ios:: out);
  23. }
  24.  
  25. inline void closef()
  26. {
  27.     f1.close();
  28.     f2.close();
  29. }
  30.  
  31. long n, miv = N, mav = -1;
  32. vector<vector<long>> mat(N);
  33.  
  34. void data()
  35. {
  36.     f1.tie(0)->sync_with_stdio(0);
  37.     f2.tie(0)->sync_with_stdio(0);
  38.     cin.tie(0)->sync_with_stdio(0);
  39.     cin >> n;
  40.     for (long i = 0; i != n; ++i)
  41.     {
  42.         for (long j = 0; j != n; ++j)
  43.         {
  44.             long x;
  45.             cin >> x;
  46.             mat[i].push_back(x);
  47.             if (x > mav)
  48.                 mav = x;
  49.             if (x < miv)
  50.                 miv = x;
  51.         }
  52.     }
  53. }
  54.  
  55. vector<short> me1 = {0, 1, 0, -1}, me2{1, 0, -1, 0};
  56. vector<vector<bool>> cam(N);
  57.  
  58. bool dfs(long i, long j, long mid, long mad)
  59. {
  60.     if (i < 0 || i >= n || j < 0 || j >= n)
  61.         return 0;
  62.  
  63.     if (cam[i][j] || mat[i][j] < mid || mat[i][j] > mad)
  64.         return 0;
  65.     if (i == n-1 && j == n-1) return 1;
  66.  
  67.     cam[i][j] = 1;
  68.  
  69.     for (int k = 0; k < 4; k++)
  70.     {
  71.         int u = i + me1[k], v = j + me2[k];
  72.         if (dfs(u, v, mid, mad)) return 1;
  73.     }
  74.   return 0;
  75. }
  76.  
  77. void init_cam()
  78. {
  79.     for (long i = 0; i != n; ++i)
  80.         cam[i].resize(n, 0);
  81. }
  82.  
  83. void reset_cam()
  84. {
  85.     for (long i = 0; i != n; ++i)
  86.         for (long j = 0; j != n; ++j)
  87.             cam[i][j] = 0;
  88. }
  89.  
  90. bool check(long del)
  91. {
  92.     for (long i = miv; i+del-1 != mav+1; ++i)
  93.     {
  94.         reset_cam();
  95.         if (dfs(0, 0, i, i+del))
  96.             return 1;
  97.     }
  98.     return 0;
  99. }
  100.  
  101. long ans = -1;
  102.  
  103. void process()
  104. {
  105.     init_cam();
  106.         long lef = 0, rig = 120;
  107.         while (lef <= rig)
  108.         {
  109.             long del = (lef+rig)/2;
  110.             if (check(del))
  111.             {
  112.                 ans = del;
  113.                 rig = del-1;
  114.             }
  115.             else
  116.                 lef = del+1;
  117.         }
  118. }
  119.  
  120. void view()
  121. {
  122.     cout << ans << nln;
  123. }
  124.  
  125. int main()
  126. {
  127.     openf();
  128.     data();
  129.     process();
  130.     view();
  131.     closef();
  132.     return 0;
  133. }
  134.  
Advertisement
Add Comment
Please, Sign In to add comment