Advertisement
mickypinata

SMMR-T226: Two Water Tanks

Mar 30th, 2020
267
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.70 KB | None | 0 0
  1. #include <iostream>
  2. #include <queue>
  3. #include <map>
  4. using namespace std;
  5.  
  6. #define pii pair<int, int>
  7. typedef long long lli;
  8.  
  9. int a, b, t, q;
  10.  
  11. lli BFSWater(pii s){
  12.     queue<pii> q;
  13.     map<pii, lli> dist;
  14.     dist[s] = 0;
  15.     q.push(s);
  16.     while(!q.empty()){
  17.         int u1 = q.front().first;
  18.         int u2 = q.front().second;
  19.         pii u = q.front();
  20.         q.pop();
  21.         if(u1 == t || u2 == t){
  22.             return dist[u];
  23.         }
  24.         /// Fill
  25.         if(dist.find({a, u2}) == dist.end()){
  26.             dist[{a, u2}] = dist[u] + 1;
  27.             q.push({a, u2});
  28.         }
  29.         if(dist.find({u1, b}) == dist.end()){
  30.             dist[{u1, b}] = dist[u] + 1;
  31.             q.push({u1, b});
  32.         }
  33.         /// Remove
  34.         if(dist.find({0, u2}) == dist.end()){
  35.             dist[{0, u2}] = dist[u] + 1;
  36.             q.push({0, u2});
  37.         }
  38.         if(dist.find({u1, 0}) == dist.end()){
  39.             dist[{u1, 0}] = dist[u] + 1;
  40.             q.push({u1, 0});
  41.         }
  42.         /// Move 1 to 2
  43.         int tmp = (u1 + u2 >= b) ? b : u1 + u2;
  44.         if(dist.find({u1 - (tmp - u2), tmp}) == dist.end()){
  45.             dist[{u1 - (tmp - u2), tmp}] = dist[u] + 1;
  46.             q.push({u1 - (tmp - u2), tmp});
  47.         }
  48.         /// Move 2 to 1
  49.         int tmp2 = (u1 + u2 >= a) ? a : u1 + u2;
  50.         if(dist.find({tmp2, u2 - (tmp2 - u1)}) == dist.end()){
  51.             dist[{tmp2, u2 - (tmp2 - u1)}] = dist[u] + 1;
  52.             q.push({tmp2, u2 - (tmp2 - u1)});
  53.         }
  54.     }
  55.     return -1;
  56. }
  57.  
  58. int main(){
  59.  
  60.     scanf("%d", &q);
  61.     for(int i  = 0; i < q; ++i){
  62.         scanf("%d %d %d", &a, &b, &t);
  63.         cout << BFSWater({0, 0}) << "\n";
  64.     }
  65.  
  66.     return 0;
  67. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement