Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- #define mp make_pair
- using namespace std;
- typedef pair<int, int> pii;
- typedef pair<pii, int> piii;
- const int MAXN = 1e2+10;
- const int INF = 1e9+10;
- map<piii, bool> M;
- int dist[MAXN][MAXN], num[MAXN][MAXN], n, m, k;
- int linha[] = {-1, 1, 0, 0};
- int coluna[] = {0, 0, -1, 1};
- void dijkstra(void)
- {
- for (int i = 1; i <= n; i++)
- for (int j = 1; j <= m; j++)
- dist[i][j] = INF;
- dist[1][1] = 0;
- priority_queue<pair<int, piii>, vector<pair<int, piii> >, greater<pair<int, piii> > > fila;
- fila.push(mp(0, mp(mp(1, 1), 0)));
- while (!fila.empty())
- {
- int x = -1, y = -1, atualx = fila.top().second.first.first, atualy = fila.top().second.first.second;
- int t = fila.top().second.second;
- fila.pop();
- if (M.find(mp(mp(atualx, atualy), t)) == M.end())
- x = atualx, y = atualy, M[mp(mp(atualx, atualy), t)] = 1;
- if (x == -1 || y == -1) continue;
- for (int i = 0; i < 4; i++)
- {
- int a = x+linha[i], b = y+coluna[i];
- if (a < 1 || a > n || b < 1 || b > m) continue;
- if (num[a][b] != -1)
- {
- if (num[x][y] != -1 && (num[x][y]+1)%k == num[a][b] && dist[a][b] > dist[x][y]+1)
- {
- dist[a][b] = dist[x][y]+1;
- fila.push(mp(dist[a][b], mp(mp(a, b), num[a][b])));
- }
- else if (num[x][y] == -1)
- {
- int d;
- if (num[a][b] > t) d = num[a][b]-t;
- else d = k-t+num[a][b];
- if (dist[a][b] > dist[x][y]+d)
- {
- dist[a][b] = dist[x][y]+d;
- fila.push(mp(dist[a][b], mp(mp(a, b), num[a][b])));
- }
- }
- }
- else
- {
- if (num[x][y] != -1 && dist[a][b] > dist[x][y]+1)
- {
- dist[a][b] = dist[x][y]+1;
- fila.push(mp(dist[a][b], mp(mp(a, b), num[x][y]+1)));
- }
- else if (num[x][y] == -1 && dist[a][b] > dist[x][y]+1)
- {
- dist[a][b] = dist[x][y]+1;
- fila.push(mp(dist[a][b], mp(mp(a, b), t+1)));
- }
- }
- }
- }
- }
- int main(void)
- {
- ios_base::sync_with_stdio(false); cin.tie(0);
- cin >> n >> m >> k;
- for (int i = 1; i <= n; i++)
- for (int j = 1; j <= m; j++)
- cin >> num[i][j];
- dijkstra();
- if (dist[n][m] == INF) cout << "-1\n";
- else cout << dist[n][m] << "\n";
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement