#include<iostream> #include<algorithm> #include<ctype.h> #include<string> #include<string.h> #include<fstream> #include<vector> #include<queue> #include"iomanip" using namespace std; int vis[101][101][101]; //用来记录已经达到的状态 struct Node { int now_Water[3]; int max_Water[3]; int step; }node,temp; queue<Node> q; int bfs() { int e[3]; cin>>node.max_Water[0]>>node.max_Water[1]>>node.max_Water[2]; cin>>e[0]>>e[1]>>e[2]; node.step = 0; node.now_Water[0] = node.max_Water[0]; node.now_Water[1] = 0; node.now_Water[2] = 0; q.push(node); //vis[node.now_Water[0]][node.now_Water[1]][node.now_Water[2]] = 1; if(node.now_Water[0] == e[0] && node.now_Water[1] == e[1] && node.now_Water[2] == e[2] ) return 0; while(!q.empty()) { node = q.front(); q.pop(); // 1->2 1->3 2->3 2->1 3->1 3->2 vis[node.now_Water[0]][node.now_Water[1]][node.now_Water[2]] = 1; for(int i=0;i<3;i++) { for(int j=0;j<3;j++) { if(i!=j) { temp = node; if(node.now_Water[i]!=0) { if(node.now_Water[j] + node.now_Water[i] <= node.max_Water[j]) { temp.now_Water[j] = node.now_Water[j] + node.now_Water[i]; temp.now_Water[i] = 0; temp.step = node.step + 1; if(temp.now_Water[0] == e[0] && temp.now_Water[1] == e[1] && temp.now_Water[2] == e[2] ) return temp.step; if(vis[temp.now_Water[0]][temp.now_Water[1]][temp.now_Water[2]] == 0) q.push(temp); } else { temp.now_Water[i] = node.now_Water[i] - (node.max_Water[j]-node.now_Water[j]); temp.now_Water[j] = node.max_Water[j]; temp.step = node.step + 1; if(temp.now_Water[0] == e[0] && temp.now_Water[1] == e[1] && temp.now_Water[2] == e[2] ) return temp.step; if(vis[temp.now_Water[0]][temp.now_Water[1]][temp.now_Water[2]] == 0) q.push(temp); } } } } } } return -1; } int main() { int n; cin>>n; while(n--) { while(!q.empty()) { q.pop(); } for(int i=0;i<101;i++) for(int j=0;j<101;j++) for(int k=0;k<101;k++) vis[i][j][k]=0; int ans = bfs(); cout<<ans<<endl; } return 0; }
三个水杯
猜你喜欢
转载自www.cnblogs.com/fzuhyj/p/9693170.html
周排行