Advertisement
Guest User

amonamarthfkingrocks

a guest
Dec 4th, 2017
99
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.70 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3.  
  4. int h, w, len = -1, ip = -99, jp = -99;
  5. int a[2002][2002];
  6. pair<bool,int> vis[2002][2002];
  7.  
  8. void visita (int i, int j)
  9. {
  10.     len++;
  11.  
  12.     if (vis[i][j].first){
  13.         cout << len + vis[i][j].second;
  14.         exit(0);
  15.     }
  16.  
  17.     vis[i][j].first = 1;
  18.     vis[i][j].second = len;
  19.  
  20.     int imin, jmin, mini;
  21.     bool esiste = 0;
  22.  
  23.     if (a[i-1][j] != -1 && (ip != i-1 || jp != j)){
  24.         esiste = 1;
  25.         imin = i-1;
  26.         jmin = j;
  27.         mini = abs(a[i][j] - a[i-1][j]);
  28.     }
  29.     if (a[i+1][j] != -1 && (ip != i+1 || jp != j)){
  30.         if (!esiste){
  31.             esiste = 1;
  32.             imin = i+1;
  33.             jmin = j;
  34.             mini = abs(a[i][j] - a[i+1][j]);
  35.         } else{
  36.             if (abs(a[i][j] - a[i+1][j]) < mini){
  37.                 mini = abs(a[i][j] - a[i+1][j]);
  38.                 imin = i+1;
  39.                 jmin = j;
  40.             } else if (abs(a[i][j] - a[i+1][j]) < mini){
  41.                 if (a[i+1][j] < a[imin][jmin]){
  42.                     imin = i+1;
  43.                     jmin = j;
  44.                 }
  45.             }
  46.         }
  47.  
  48.     }
  49.     if (a[i][j-1] != -1 && (ip != i || jp != j-1)){
  50.         if (!esiste){
  51.             esiste = 1;
  52.             imin = i;
  53.             jmin = j-1;
  54.             mini = abs(a[i][j] - a[i][j-1]);
  55.         } else{
  56.             if (abs(a[i][j] - a[i][j-1]) < mini){
  57.                 mini = abs(a[i][j] - a[i][j-1]);
  58.                 imin = i;
  59.                 jmin = j-1;
  60.             } else if (abs(a[i][j] - a[i][j-1]) < mini){
  61.                 if (a[i][j-1] < a[imin][jmin]){
  62.                     imin = i;
  63.                     jmin = j-1;
  64.                 }
  65.             }
  66.         }
  67.  
  68.     }
  69.     if (a[i][j+1] != -1 && (ip != i || jp != j+1)){
  70.         if (abs(a[i][j] - a[i][j+1]) < mini){
  71.                 mini = abs(a[i][j] - a[i][j+1]);
  72.                 imin = i;
  73.                 jmin = j+1;
  74.             } else if (abs(a[i][j] - a[i][j+1]) < mini){
  75.                 if (a[i][j+1] < a[imin][jmin]){
  76.                     imin = i;
  77.                     jmin = j+1;
  78.                 }
  79.             }
  80.         }
  81.  
  82.     ip = i, jp = j;
  83.     visita(imin, jmin);
  84. }
  85.  
  86.  
  87. int main()
  88. {
  89.     freopen("input.txt","r",stdin);
  90.     freopen("output.txt","w",stdout);
  91.     ios_base::sync_with_stdio(!!false);
  92.  
  93.     cin >> h >> w;
  94.  
  95.     if(h==1 && w==1){
  96.         cout << 0;
  97.         return 0;
  98.     }
  99.  
  100.     for (int i=1; i<=h; i++)
  101.         for (int j=1; j<=w; j++)
  102.             cin >> a[i][j];
  103.  
  104.  
  105.     for (int i=0; i<=h+1; i++){
  106.         a[i][0] = -1;
  107.         a[i][w+1] = -1;
  108.     }
  109.  
  110.     for (int i=0; i<=w+1; i++){
  111.         a[0][i] = -1;
  112.         a[h+1][i] = -1;
  113.     }
  114.  
  115.     visita(1,1);
  116.  
  117.     return 0;
  118. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement