20200319-leetcode-365. 水壶问题

在这里插入图片描述
题目链接

倒水问题,应该用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;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值