倒水问题,应该用BFS可以做,不知道为什么写的代码
一直没有返回的结果。wa
当前两个水杯里的水为ans1和ans2,那么下一步的操作,只有8个状态,bfs八种状态即可。
判断一个状态是否已经存在,可以用set判断,但是
不会写set里面存放结构体的时候,如何比较
于是就自己写了一个findHash,来判断是否存在先前的状态。
,
#include <iostream>
#include <queue>
#include <vector>
#include <set>
#include <cstring>
using namespace std;
class Solution {
public:
bool check(int x,int y,int z){
if(x==z||y==z||(x+y)==z) return true;
return false;
}
long long findHash(vector<int> v){
return v[0]*10007+v[1];
}
bool canMeasureWater(int x, int y, int z) {
if(x+y<z) return false;
if(check(x,y,z)) return true;
//调整x,y顺序,默认x<=y
if(x>y){int t=0;t=x;x=y;y=t;}
queue<vector<int> > q;
vector<int> res;
int ha[1000000];
memset(ha,0,sizeof(ha));
res.clear();
res[0]=0;res[1]=0;
q.push(res);
ha[findHash(res)]=1;
while(!q.empty())
{
vector<int> frontNode=q.front();
q.pop();
int ans1=frontNode[0],ans2=frontNode[1];
if(check(ans1,ans2,z)) return true;
//下面一共还有六种状态
vector<int> v;
//way1
v[0]=0;v[1]=ans2;
if(ha[findHash(v)]==0){
q.push(v);v.clear();
}
//way2
v[0]=ans1;v[1]=0;
if(ha[findHash(v)]==0){
q.push(v);v.clear();
}
if(ans1+ans2<=x){
v[0]=ans1+ans2;v[1]=0;
if(ha[findHash(v)]==0){
q.push(v);v.clear();
}
}
if(ans2-x+ans1>=0){
v[0]=x;v[1]=ans2-x+ans1;
if(ha[findHash(v)]==0){
q.push(v);v.clear();
}
}
if(ans1+ans2<=y){
v[0]=0;v[1]=ans1+ans2;
if(ha[findHash(v)]==0){
q.push(v);v.clear();
}
}
if(ans1-y+ans2>=0){
v[0]=ans1-y+ans2;v[1]=y;
if(ha[findHash(v)]==0){
q.push(v);v.clear();
}
}
v.clear();
}
return false;
}
};
int main()
{
Solution s;
int x,y,z;
cin>>x>>y>>z;
if(s.canMeasureWater(x,y,z)) cout<<"true"<<endl;
else cout<<"false"<<endl;
return 0;
}
看到别人数学答案
class Solution {
public:
int gcd(int x,int y) {return y>0?gcd(y,x%y):x;}
bool canMeasureWater(int x, int y, int z) {
if(z==0) return true;
if(x+y<z) return false;
if(x==0||y==0) return x+y==z;
return z%gcd(x,y)==0;
}
};