Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <queue>
- #include <map>
- using namespace std;
- #define pii pair<int, int>
- typedef long long lli;
- int a, b, t, q;
- lli BFSWater(pii s){
- queue<pii> q;
- map<pii, lli> dist;
- dist[s] = 0;
- q.push(s);
- while(!q.empty()){
- int u1 = q.front().first;
- int u2 = q.front().second;
- pii u = q.front();
- q.pop();
- if(u1 == t || u2 == t){
- return dist[u];
- }
- /// Fill
- if(dist.find({a, u2}) == dist.end()){
- dist[{a, u2}] = dist[u] + 1;
- q.push({a, u2});
- }
- if(dist.find({u1, b}) == dist.end()){
- dist[{u1, b}] = dist[u] + 1;
- q.push({u1, b});
- }
- /// Remove
- if(dist.find({0, u2}) == dist.end()){
- dist[{0, u2}] = dist[u] + 1;
- q.push({0, u2});
- }
- if(dist.find({u1, 0}) == dist.end()){
- dist[{u1, 0}] = dist[u] + 1;
- q.push({u1, 0});
- }
- /// Move 1 to 2
- int tmp = (u1 + u2 >= b) ? b : u1 + u2;
- if(dist.find({u1 - (tmp - u2), tmp}) == dist.end()){
- dist[{u1 - (tmp - u2), tmp}] = dist[u] + 1;
- q.push({u1 - (tmp - u2), tmp});
- }
- /// Move 2 to 1
- int tmp2 = (u1 + u2 >= a) ? a : u1 + u2;
- if(dist.find({tmp2, u2 - (tmp2 - u1)}) == dist.end()){
- dist[{tmp2, u2 - (tmp2 - u1)}] = dist[u] + 1;
- q.push({tmp2, u2 - (tmp2 - u1)});
- }
- }
- return -1;
- }
- int main(){
- scanf("%d", &q);
- for(int i = 0; i < q; ++i){
- scanf("%d %d %d", &a, &b, &t);
- cout << BFSWater({0, 0}) << "\n";
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement