Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- using namespace std;
- #define IOS ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
- #define endl "\n"
- #define int long long
- int dx[] = {1, -1, 0, 0};
- int dy[] = {0, 0, 1, -1};
- const int N = 1005;
- int n, m, k;
- char a[N][N];
- int vis[N][N];
- int dis[N][N];
- int final[N][N];
- pair<int, int> src, des;
- int32_t main()
- {
- IOS
- cin >> n >> m >> k;
- for(int i = 1; i <= n; i++) {
- for(int j = 1; j <= m; j++) {
- dis[i][j] = -1;
- }
- }
- for(int i = 1; i <= n; i++) {
- for(int j = 1; j <= m; j++) {
- cin >> a[i][j];
- if(a[i][j] == 'S') {
- src = {i, j};
- }
- if(a[i][j] == 'E') {
- des = {i, j};
- }
- if(a[i][j] == '#')
- dis[i][j] = 0;
- }
- }
- priority_queue<tuple<int, int, int>> q;
- for(int i = 1; i <= k; i++) {
- int r, c, d;
- cin >> r >> c >> d;
- q.push({d, r, c});
- vis[r][c] = 1;
- dis[r][c] = d;
- }
- while(!q.empty()) {
- int d, x, y;
- tie(d, x, y) = q.top();
- q.pop();
- for(int i = 0; i < 4; i++) {
- int nx = x + dx[i];
- int ny = y + dy[i];
- if(nx == 0 || nx > n || ny == 0 || ny > m || a[nx][ny] == '#')
- continue;
- if(!vis[nx][ny]) {
- dis[nx][ny] = dis[x][y] - 1;
- q.push({dis[nx][ny], nx, ny});
- vis[nx][ny] = 1;
- }
- }
- }
- for(int i = 1; i <= n; i++) {
- for(int j = 1; j <= m; j++) {
- vis[i][j] = 0;
- final[i][j] = 1e9;
- }
- }
- if(dis[src.first][src.second] >= 0) {
- cout << "IMPOSSIBLE" << endl;
- exit(0);
- }
- queue<pair<int, int>> pq;
- pq.push(src);
- final[src.first][src.second] = 0;
- while(!pq.empty()) {
- pair<int, int> tmp = pq.front();
- int x = tmp.first;
- int y = tmp.second;
- pq.pop();
- for(int i = 0; i < 4; i++) {
- int nx = x + dx[i];
- int ny = y + dy[i];
- if(nx == 0 || nx > n || ny == 0 || ny > m || dis[nx][ny] >= 0)
- continue;
- if(!vis[nx][ny]) {
- final[nx][ny] = final[x][y] + 1;
- pq.push({nx, ny});
- vis[nx][ny] = 1;
- }
- }
- }
- if(final[des.first][des.second] == 1e9) {
- cout << "IMPOSSIBLE" << endl;
- } else {
- cout << final[des.first][des.second] << endl;
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement