Advertisement
Josif_tepe

Untitled

May 6th, 2025
289
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.49 KB | None | 0 0
  1. #include <iostream>
  2. #include <queue>
  3. #include <cstring>
  4. #include <fstream>
  5. #include <vector>
  6. using namespace std;
  7. int n, m;
  8. char mat[1001][1001];
  9. int si, sj;
  10. int ei, ej;
  11. int dist[1001][1001];
  12. vector<pair<int, int> > guards;
  13. const int di[] = {-1, 1, 0, 0};
  14. const int dj[] = {0, 0, -1, 1};
  15. bool visited[1001][1001];
  16. struct node{
  17.     int ii, jj, cost;
  18.     node(){}
  19.     node(int _ii, int _jj, int _cost){
  20.         ii = _ii;
  21.         jj = _jj;
  22.         cost = _cost;
  23.     }
  24.     bool operator < (const node &a)const{
  25.         return cost < a.cost;
  26.     }
  27. };
  28. int main()
  29. {
  30.     ios_base::sync_with_stdio(false);
  31.     cin >> n >> m;
  32.     for(int i = 0; i < n; i ++){
  33.         for(int j = 0; j < m; j ++){
  34.             cin >> mat[i][j];
  35.             if(mat[i][j] == 'R'){
  36.                 si = i;
  37.                 sj = j;
  38.             }
  39.             if(mat[i][j] == 'Z'){
  40.                 ei = i;
  41.                 ej = j;
  42.             }
  43.             if(mat[i][j] == 'G'){
  44.                 guards.push_back(make_pair(i, j));
  45.             }
  46.         }
  47.     }
  48.     queue<int> q;
  49.     memset(dist, -1, sizeof dist);
  50.     for(int i =0; i < guards.size(); i ++){
  51.         q.push(guards[i].first);
  52.         q.push(guards[i].second);
  53.         dist[guards[i].first][guards[i].second] = 0;
  54.     }
  55.     memset(visited, false, sizeof visited);
  56.     int ii, jj, ni, nj;
  57.      
  58.     while(!q.empty()){
  59.         ii = q.front();
  60.         q.pop();
  61.         jj = q.front();
  62.         q.pop();
  63.         for(int k =0; k < 4; k ++){
  64.             ni = di[k] + ii;
  65.             nj = dj[k] + jj;
  66.             if(ni < 0 || nj < 0 || ni >= n || nj >= m)continue;
  67.             if(dist[ni][nj] != -1)continue;
  68.             if(mat[ni][nj] == '*')continue;
  69.             dist[ni][nj] = dist[ii][jj] + 1;
  70.             q.push(ni);
  71.             q.push(nj);
  72.         }
  73.     }
  74.     priority_queue<node> pq;
  75.     pq.push(node(si, sj, dist[si][sj]));
  76.     visited[si][sj] = true;
  77.     node tmp;
  78.     while(!pq.empty()){
  79.         tmp = pq.top();
  80.         pq.pop();
  81.         if(tmp.ii == ei && tmp.jj == ej){
  82.             cout << tmp.cost << endl;
  83.             break;
  84.         }
  85.         for(int k = 0; k < 4; k ++){
  86.             ni = di[k] + tmp.ii;
  87.             nj = dj[k] + tmp.jj;
  88.             if(ni < 0 || nj < 0 || ni >= n || nj >= m)continue;
  89.             if(visited[ni][nj])continue;
  90.             if(mat[ni][nj] == '*')continue;
  91.             visited[ni][nj] = true;
  92.             pq.push(node(ni, nj, min(tmp.cost, dist[ni][nj])));
  93.         }
  94.     }
  95.     return 0;
  96. }
  97.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement