记录一下,第一次遇到自定义unordered_set的hash函数
int x, y, z;
struct node {
int a, b;
node(int x, int y) :a(x), b(y) {};
bool operator == (const node &nd) const {
return nd.a == a && nd.b == b;
}
};
struct nodehash
{
size_t operator()(const node& nd) const {
return hash<int>()(nd.a) + hash<int>()(nd.b);
}
};
unordered_set<node,nodehash> vis;
int ok = 0;
int bfs() {
queue<node>q;
q.push(node(0, 0));
while (!q.empty()) {
node temp = q.front();
q.pop();
if (temp.a == z || temp.b == z || temp.a + temp.b == z) { ok = 1; break; }
vis.insert(node(temp.a, temp.b));
if (!vis.count(node(0, temp.b))) {
vis.insert(node(0, temp.b));
q.push(node(0, temp.b));
}
if (!vis.count(node(temp.a, 0))) {
vis.insert(node(temp.a, 0));
q.push(node(temp.a, 0));
}
if (!vis.count(node(temp.a, y))) {
vis.insert(node(temp.a, y));
q.push(node(temp.a, y));
}
if (!vis.count(node(x, temp.b))) {
vis.insert(node(x, temp.b));
q.push(node(x, temp.b));
}
int v1 = temp.a > y - temp.b ? y - temp.b : temp.a;
if (!vis.count(node(temp.a - v1, temp.b + v1))) {
vis.insert(node(temp.a - v1, temp.b + v1));
q.push(node(temp.a - v1, temp.b + v1));
}
v1 = temp.b > x - temp.a ? x - temp.a : temp.b;
if (!vis.count(node(temp.a + v1, temp.b - v1))) {
vis.insert(node(temp.a + v1, temp.b - v1));
q.push(node(temp.a + v1, temp.b - v1));
}
}
return ok;
}
bool canMeasureWater(int X, int Y, int Z) {
x = X;
y = Y;
z = Z;
if(x + y < z)return false;
return bfs();
}