vitormartinotti

fire

Oct 14th, 2024
35
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.32 KB | None | 0 0
  1. //Solução do problema para apenas um caso de teste
  2. #include<bits/stdc++.h>
  3. #define MAXN 510
  4. #define pii pair<int,int>
  5.  
  6. using namespace std;
  7.  
  8. char m[MAXN][MAXN];
  9. int marc[MAXN][MAXN];
  10. int dist[MAXN][MAXN];
  11.  
  12. int l, c;
  13.  
  14. int dx[] = {0, 0, 1, -1};
  15. int dy[] = {1, -1, 0, 0};
  16.  
  17. vector<pii> focos;
  18.  
  19. void bfs_ms(){
  20.     queue<pii> q;
  21.     for(auto e : focos){
  22.         q.push(e);
  23.         marc[e.first][e.second] = 1;
  24.         dist[e.first][e.second] = 0;
  25.     }
  26.     while(!q.empty()){
  27.         pii v = q.front(); q.pop();
  28.         int x = v.first;
  29.         int y = v.second;
  30.         for(int k = 0; k <= 3; k++){
  31.             int nx = x + dx[k];
  32.             int ny = y + dy[k];
  33.             if(nx < 0 || nx >= l) continue;
  34.             if(ny < 0 || ny >= c) continue;
  35.             if(m[nx][ny] == '#' || marc[nx][ny] == 1) continue;
  36.             q.push({nx, ny});
  37.             marc[nx][ny] = 1;
  38.             dist[nx][ny] = dist[x][y]+1;
  39.         }
  40.     }
  41. }
  42.  
  43.  
  44. int bfs(pii s){
  45.     memset(marc, 0, sizeof marc);
  46.     queue<pii> q;
  47.     q.push(s);
  48.     marc[s.first][s.second] = 1;
  49.     dist[s.first][s.second] = 0;
  50.    
  51.     while(!q.empty()){
  52.         pii v = q.front(); q.pop();
  53.         int x = v.first;
  54.         int y = v.second;
  55.        
  56.         if(x == 0 || x == l-1 || y == 0 || y == c-1) return dist[x][y]+1;
  57.        
  58.         for(int k = 0; k <= 3; k++){
  59.             int nx = x + dx[k];
  60.             int ny = y + dy[k];
  61.             if(nx < 0 || nx >= l) continue;
  62.             if(ny < 0 || ny >= c) continue;
  63.             if(m[nx][ny] == '#' || marc[nx][ny] == 1) continue;
  64.             if(dist[x][y]+1 < dist[nx][ny]){
  65.                 q.push({nx, ny});
  66.                 marc[nx][ny] = 1;
  67.                 dist[nx][ny] = dist[x][y]+1;
  68.             }
  69.         }
  70.     }
  71.    
  72.     return -1;
  73. }
  74.  
  75. int main(){
  76.     scanf("%d %d",&c, &l);
  77.    
  78.     pii ini;
  79.    
  80.     for(int i = 0; i < l; i++){
  81.         for(int j = 0; j < c; j++){
  82.             scanf(" %c", &m[i][j]);
  83.             if(m[i][j] == '*') focos.push_back({i,j});
  84.             if(m[i][j] == '@') ini = {i,j};
  85.         }
  86.     }
  87.    
  88.     bfs_ms();
  89.    
  90.     //for(int i = 0; i < l; i++){
  91.     //    for(int j = 0; j < c; j++){
  92.     //        printf("%d ", marc[i][j]);
  93.     //    }
  94.     //    printf("\n");
  95.     //}
  96.    
  97.     int resp = bfs(ini);
  98.    
  99.     printf("%d", resp);
  100. }
Add Comment
Please, Sign In to add comment