giabinh

MoutainWalking

Nov 7th, 2015
121
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.41 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2.  
  3. #define maxH 115
  4. #define maxN 105
  5.  
  6. using namespace std;
  7.  
  8. int n, h, l, ans = maxH, a[maxN][maxN];
  9. int dx[] = {-1, 0, 1, 0},
  10.     dy[] = {0, 1, 0, -1};
  11. bool visited[maxN][maxN];
  12.  
  13. bool ok(int x) {
  14.     if (x >= 1 && x <= n) return true; else return false;
  15. }
  16.  
  17. bool check(int mid) {
  18.     queue <int> q;
  19.     q.push(1); q.push(1);
  20.     memset(visited, false, sizeof visited);
  21.     visited[1][1] = true;
  22.  
  23.     while (!q.empty())
  24.     {
  25.         int ux = q.front(); q.pop();
  26.         int uy = q.front(); q.pop();
  27.         if (ux == n && uy == n) return true;
  28.         visited[ux][uy] = true;
  29.         for (int k=0; k<4; ++k)
  30.         {
  31.             int vx = ux + dx[k], vy = uy + dy[k];
  32.             if (ok(vx) && ok(vy) && !visited[vx][vy] && abs(a[ux][uy] - a[vx][vy]) <= mid)
  33.             {
  34.                 q.push(vx); q.push(vy);
  35.             }
  36.         }
  37.     }
  38.  
  39.     if (!visited[n][n]) return false; else return true;
  40. }
  41.  
  42. int main() {
  43.     #ifndef ONLINE_JUDGE
  44.         freopen("MTWALK.inp", "r", stdin);
  45.     #endif // ONLINE_JUDGE
  46.  
  47.     scanf("%d", &n);
  48.     for (int i=1; i<=n; ++i)
  49.         for (int j=1; j<=n; ++j) scanf("%d", &a[i][j]);
  50.  
  51.     l = 0; h = maxH;
  52.     while (l <= h)
  53.     {
  54.         int mid = (l + h) / 2;
  55.         if (check(mid))
  56.         {
  57.             ans = mid;
  58.             h = mid - 1;
  59.         } else l = mid + 1;
  60.     }
  61.  
  62.     printf("%d", ans);
  63.  
  64.     return 0;
  65. }
Advertisement
Add Comment
Please, Sign In to add comment