描述
设有大小不等的三个无刻度的油桶,分别能盛满x,y,z公升油。初始时,第一个油桶盛满油,第二、三个油桶为空,在某一个油桶上分出targ公升油。
输入
输入包含多组测试数据。每组数据包含一行。分别x,y,z,targ四个整数,x,y,z,targ都大于 等于0,且小于32767。
输出
对应每组输出YES或者NO。如果可以分出targ公升油就输出YES,否则就输出NO。
样例输入
80 50 30 40
样例输出
YES
提示
使用队列。分油过程中,由于油桶上没有刻度,只能将油桶倒满或者倒空。三个油桶盛油的总量始终等于初始时第一个油桶盛满的油量。
题意
给你3个油桶,初始化第一个装满,第二个第三个为空,求能否有一个桶为targ升油,不能有丢弃
题解
一开始没读懂题意,傻逼了半天,题目读懂后就很easy了
这里用广搜搜索所有情况就行了,很暴力很无脑
这里由于X,Y,Z有点大,存状态开三维数组爆内存,这里用了map中的哈希思想
代码
1 #include<bits/stdc++.h> 2 using namespace std; 3 struct Node 4 { 5 int x,y,z; 6 Node(int x,int y,int z):x(x),y(y),z(z){} 7 }; 8 string To_string(int x,int y,int z) 9 { 10 stringstream ss; 11 ss<<x;ss<<y;ss<<z; 12 return ss.str(); 13 } 14 int main() 15 { 16 int x,y,z,targ; 17 while(scanf("%d%d%d%d",&x,&y,&z,&targ)!=EOF) 18 { 19 int flag=0; 20 queue<Node> q; 21 map<string,int> ma; 22 q.push(Node(x,0,0)); 23 while(!q.empty()) 24 { 25 Node h=q.front();q.pop(); 26 if(h.x==targ||h.y==targ||h.z==targ){flag=1;break;}//成功 27 if(ma[To_string(h.x,h.y,h.z)])continue;//状态有过,跳过 28 ma[To_string(h.x,h.y,h.z)]=1;//标记 29 30 if(h.x+h.y<=y)q.push(Node(0,h.x+h.y,h.z));//x->y不会溢出,全倒过去 31 else q.push(Node(h.x-y+h.y,y,h.z));//x->y会溢出,y倒满 32 33 if(h.x+h.z<=z)q.push(Node(0,h.y,h.x+h.z));//x->z 34 else q.push(Node(h.x-z+h.z,y,z)); 35 36 if(h.x+h.y<=x)q.push(Node(h.x+h.y,0,h.z));//y->x 37 else q.push(Node(x,h.y-x+h.x,h.z)); 38 39 if(h.y+h.z<=z)q.push(Node(h.x,0,h.y+h.z));//y->z 40 else q.push(Node(h.x,h.y-z+h.z,z)); 41 42 if(h.x+h.z<=x)q.push(Node(h.x+h.z,h.y,0));//z->x 43 else q.push(Node(x,h.y,h.z-x+h.x)); 44 45 if(h.y+h.z<=y)q.push(Node(x,h.y+h.z,0));//z->y 46 else q.push(Node(h.x,y,h.z-y+h.y)); 47 } 48 printf("%s ",flag?"YES":"NO"); 49 } 50 return 0; 51 }