Advertisement
FiloSanza

Mecho

Oct 20th, 2017
78
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.43 KB | None | 0 0
  1. #include <algorithm>
  2. #include <fstream>
  3. #include <vector>
  4. #include <queue>
  5.  
  6. using namespace std;
  7.  
  8. ifstream fin("input.txt");
  9. ofstream fout("output.txt");
  10.  
  11. typedef pair<int, int> pii;
  12. #define r first
  13. #define c second
  14.  
  15. const int inf = 1e9;
  16. int N, S;
  17. pii start, _end;
  18. queue <pii> q;
  19. vector <vector<char>> m;
  20. vector <vector<int>> bees, dist;
  21. vector <pii> salti = {{0, 1}, {0, -1}, {1, 0}, {-1, 0}};
  22.  
  23. pii merge(pii a, pii b){
  24.     return {a.r + b.r, a.c + b.c};
  25. }
  26.  
  27. //mi creo una matrice dove mi salvo da quando le api saranno in quel punto
  28. void bee(){
  29.     while(!q.empty()){
  30.         auto curr = q.front();
  31.         q.pop();
  32.         for(auto i : salti){
  33.             i = merge(curr, i);
  34.             //se esco dalla mappa, sono su un albero, sono a casa di MECHO o ho già raggiunto la cella
  35.             if(i.r < 0 || i.r >= N || i.c < 0 || i.c >= N || m[i.r][i.c] == 'T' || m[i.r][i.c] == 'D' || bees[i.r][i.c] != inf)
  36.                 continue;
  37.             bees[i.r][i.c] = bees[curr.r][curr.c] + 1;
  38.             q.push(i);
  39.         }
  40.     }
  41. }
  42.  
  43. bool prova(int k){
  44.     queue <pii> que;
  45.     for(auto &i : dist)
  46.         for(auto &j : i)
  47.             j = inf;
  48.  
  49.     //visto che per sapere quanti minuti sono passati faccio dist/S parto dopo aver fatto K*S passi
  50.     dist[start.r][start.c] = k*S;
  51.     que.push(start);
  52.  
  53.     while(!que.empty()){
  54.         auto curr = que.front();
  55.         que.pop();
  56.  
  57.         //le api arrivano prima di MECHO o mentre sono nella cella
  58.         if(dist[curr.r][curr.c] / S >= bees[curr.r][curr.c])
  59.             continue;
  60.  
  61.         //fine
  62.         if(curr.r == _end.r && curr.c == _end.c)
  63.             return true;
  64.  
  65.         for(auto i : salti){
  66.             i = merge(i, curr);
  67.             //se esco dalla mappa, sono su un albero, ho già raggiunto la cella
  68.             if(i.r < 0 || i.r >= N || i.c < 0 || i.c >= N || m[i.r][i.c] == 'T' || dist[i.r][i.c] != inf)
  69.                 continue;
  70.             dist[i.r][i.c] = dist[curr.r][curr.c] + 1;
  71.             que.push(i);
  72.         }
  73.     }
  74.     return false;
  75. }
  76.  
  77. int main(){
  78.     fin >> N >> S;
  79.     m.resize(N, vector<char>(N));
  80.     dist.resize(N, vector<int>(N, inf));
  81.     bees.resize(N, vector<int>(N, inf));
  82.  
  83.     for(int i=0; i<N; i++){
  84.         for(int j=0; j<N; j++){
  85.             fin >> m[i][j];
  86.             switch(m[i][j]){
  87.                 case 'M':
  88.                     start = {i, j};
  89.                     break;
  90.                 case 'H':
  91.                     q.push({i, j});
  92.                     bees[i][j] = 0;
  93.                     break;
  94.                 case 'D':
  95.                     _end = {i, j};
  96.                     break;
  97.                 default:
  98.                     break;
  99.             }
  100.         }
  101.     }
  102.  
  103.     bee();
  104.  
  105.     int ans = 0;
  106.     int l = 0, u = 800*800+1;
  107.     while(l <= u){
  108.         int mid = (l+u) / 2;
  109.         if(prova(mid)){
  110.             ans = mid;
  111.             l = mid+1;
  112.         }
  113.         else
  114.             u = mid - 1;
  115.     }
  116.  
  117.     fout << ans;
  118.     return 0;
  119. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement