Advertisement
Guest User

Untitled

a guest
Jun 21st, 2018
86
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.69 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. #define mp make_pair
  3.  
  4. using namespace std;
  5.  
  6. typedef pair<int, int> pii;
  7. typedef pair<pii, int> piii;
  8.  
  9. const int MAXN = 1e2+10;
  10. const int INF = 1e9+10;
  11.  
  12. map<piii, bool> M;
  13. int dist[MAXN][MAXN], num[MAXN][MAXN], n, m, k;
  14.  
  15. int linha[] = {-1, 1, 0, 0};
  16. int coluna[] = {0, 0, -1, 1};
  17.  
  18. void dijkstra(void)
  19. {
  20.     for (int i = 1; i <= n; i++)
  21.         for (int j = 1; j <= m; j++)
  22.             dist[i][j] = INF;
  23.     dist[1][1] = 0;
  24.     priority_queue<pair<int, piii>, vector<pair<int, piii> >, greater<pair<int, piii> > > fila;
  25.     fila.push(mp(0, mp(mp(1, 1), 0)));
  26.  
  27.     while (!fila.empty())
  28.     {
  29.         int x = -1, y = -1, atualx = fila.top().second.first.first, atualy = fila.top().second.first.second;
  30.         int t = fila.top().second.second;
  31.         fila.pop();
  32.         if (M.find(mp(mp(atualx, atualy), t)) == M.end())
  33.             x = atualx, y = atualy, M[mp(mp(atualx, atualy), t)] = 1;
  34.         if (x == -1 || y == -1) continue;
  35.  
  36.         for (int i = 0; i < 4; i++)
  37.         {
  38.             int a = x+linha[i], b = y+coluna[i];
  39.             if (a < 1 || a > n || b < 1 || b > m) continue;
  40.  
  41.             if (num[a][b] != -1)
  42.             {
  43.                 if (num[x][y] != -1 && (num[x][y]+1)%k == num[a][b] && dist[a][b] > dist[x][y]+1)
  44.                 {
  45.                     dist[a][b] = dist[x][y]+1;
  46.                     fila.push(mp(dist[a][b], mp(mp(a, b), num[a][b])));
  47.                 }
  48.                 else if (num[x][y] == -1)
  49.                 {
  50.                     int d;
  51.                     if (num[a][b] > t) d = num[a][b]-t;
  52.                     else d = k-t+num[a][b];
  53.                     if (dist[a][b] > dist[x][y]+d)
  54.                     {
  55.                         dist[a][b] = dist[x][y]+d;
  56.                         fila.push(mp(dist[a][b], mp(mp(a, b), num[a][b])));
  57.                     }
  58.                 }
  59.             }
  60.             else
  61.             {
  62.                 if (num[x][y] != -1 && dist[a][b] > dist[x][y]+1)
  63.                 {
  64.                     dist[a][b] = dist[x][y]+1;
  65.                     fila.push(mp(dist[a][b], mp(mp(a, b), num[x][y]+1)));
  66.                 }
  67.                 else if (num[x][y] == -1 && dist[a][b] > dist[x][y]+1)
  68.                 {
  69.                     dist[a][b] = dist[x][y]+1;
  70.                     fila.push(mp(dist[a][b], mp(mp(a, b), t+1)));
  71.                 }
  72.             }
  73.         }
  74.     }
  75. }
  76.  
  77. int main(void)
  78. {
  79.     ios_base::sync_with_stdio(false); cin.tie(0);
  80.     cin >> n >> m >> k;
  81.     for (int i = 1; i <= n; i++)
  82.         for (int j = 1; j <= m; j++)
  83.             cin >> num[i][j];
  84.     dijkstra();
  85.  
  86.     if (dist[n][m] == INF) cout << "-1\n";
  87.     else cout << dist[n][m] << "\n";
  88.     return 0;
  89. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement