Advertisement
marius004

Untitled

Feb 19th, 2020
115
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.41 KB | None | 0 0
  1. #include <iostream>
  2. #include <fstream>
  3. #include <vector>
  4. #include <queue>
  5.  
  6. std::ifstream f("labirint.in");
  7. std::ofstream g("labirint.out");
  8.  
  9. const int dx[] = { -1 , 1 , 0 , 0 };
  10. const int dy[] = { 0 , 0 , 1 , -1 };
  11.  
  12. const int NMAX = 1005;
  13. int n,m,cost[NMAX][NMAX],cost2[NMAX][NMAX];
  14. char matrix[NMAX][NMAX];
  15. bool vis[NMAX][NMAX];
  16. std::queue<std::pair<int,int>>Q;
  17. std::vector<std::pair<int,int>>chei;
  18. std::vector<std::pair<int,int>>iesiri;
  19.  
  20. bool isValid(int i,int j){
  21.     return  i >= 1 && i <= n && j >= 1 && j <= m;
  22. }
  23.  
  24. int main(){
  25.    
  26.     f >> n >> m;
  27.    
  28.     for(int i = 1;i <= n;++i){
  29.         for(int j = 1;j <= m;++j){
  30.             f >> matrix[i][j];
  31.             if(matrix[i][j] == 'A'){
  32.                 Q.push({i,j});
  33.                 vis[i][j] = true;
  34.                 cost[i][j] = 1;
  35.             }else if(matrix[i][j] == 'B'){
  36.                 chei.push_back({i,j});
  37.                 cost2[i][j] = 1;
  38.             }else if(matrix[i][j] == 'C'){
  39.                 iesiri.push_back({i,j});
  40.             }
  41.         }
  42.     }
  43.    
  44.     // Lee 'A' -> 'B'
  45.     while(!Q.empty()){
  46.        
  47.         int i = Q.front().first;
  48.         int j = Q.front().second;
  49.         Q.pop();
  50.        
  51.         for(int dir = 0;dir < 4;++dir){
  52.            
  53.             int next_i = i + dx[dir];
  54.             int next_j = j + dy[dir];
  55.            
  56.             if(isValid(next_i,next_j) && !vis[next_i][next_j]){
  57.                 if(matrix[next_i][next_j] != 'Z'){
  58.                     vis[next_i][next_j] = true;
  59.                     cost[next_i][next_j] = cost[i][j] + 1;
  60.                     Q.push( {next_i,next_j} );
  61.                 }
  62.             }
  63.         }
  64.     }
  65.    
  66.     while(!Q.empty())
  67.         Q.pop();
  68.    
  69.     for(int i = 1;i <= n;++i)
  70.         for(int j = 1;j <= m;++j)
  71.             vis[i][j] = false;
  72.    
  73.     for(auto cheie : chei){
  74.         Q.push(cheie);
  75.         vis[cheie.first][cheie.second] = true;
  76.     }
  77.    
  78.     // B -> C
  79.     while(!Q.empty()){
  80.        
  81.         int i = Q.front().first;
  82.         int j = Q.front().second;
  83.         Q.pop();
  84.        
  85.         for(int dir = 0;dir < 4;++dir){
  86.            
  87.             int next_i = i + dx[dir];
  88.             int next_j = j + dy[dir];
  89.            
  90.             if(isValid(next_i,next_j) && !vis[next_i][next_j]){
  91.                
  92.                 if(matrix[next_i][next_j] != 'Z'){
  93.                     if(matrix[next_i][next_j] != 'C'){
  94.                         vis[next_i][next_j] = true;
  95.                         cost2[next_i][next_j] = cost2[i][j] + 1;
  96.                         Q.push( {next_i,next_j} );
  97.                     }else{
  98.                         vis[next_i][next_j] = true;
  99.                         cost2[next_i][next_j] = cost2[i][j];
  100.                         Q.push( {next_i,next_j} );
  101.                     }
  102.                 }
  103.             }
  104.         }
  105.     }
  106.    
  107.     //cost -> chei
  108.     //cost2 ->iesiri
  109.    
  110.     /*
  111.     for(int i = 1;i <= n;++i,g << '\n')
  112.         for(int j = 1;j <= m;++j)
  113.             g << cost2[i][j] << ' ';
  114.      */
  115.    
  116.     int sol = (1 << 30);
  117.    
  118.     for(int i = 0;i < iesiri.size();++i)
  119.         for(int j = 0;j < chei.size();++j)
  120.             if(cost[ chei[j].first ][ chei[j].second ] +
  121.                cost2[ iesiri[i].first ][iesiri[i].second] < sol)
  122.                 sol = cost[ chei[j].first ][ chei[j].second ] +
  123.                 cost2[ iesiri[i].first ][iesiri[i].second] ;
  124.    
  125.     g << sol;
  126.    
  127.     return 0;
  128. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement