Files
Data-Structure/Algorithm/DS-Related/Graph/DFS/UVa10603-Fill.cpp
2025-09-02 08:59:59 +08:00

64 lines
1.3 KiB
C++

#include <iostream>
#include <vector>
#include <set>
#include <bits/stdc++.h>
using namespace std;
bool have = false;
set<tuple<int,int,int>> visited;
int A, B, C; // 三个容器的容量
void dfs(int a, int b, int c, int target) {
if (a == target || b == target || c == target) {
have = true;
return;
}
auto state = make_tuple(a, b, c);
if (visited.find(state) != visited.end()) return;
visited.insert(state);
// 六种倒水操作
// a -> b
{
int pour = min(a, B - b);
dfs(a - pour, b + pour, c, target);
}
// a -> c
{
int pour = min(a, C - c);
dfs(a - pour, b, c + pour, target);
}
// b -> a
{
int pour = min(b, A - a);
dfs(a + pour, b - pour, c, target);
}
// b -> c
{
int pour = min(b, C - c);
dfs(a, b - pour, c + pour, target);
}
// c -> a
{
int pour = min(c, A - a);
dfs(a + pour, b, c - pour, target);
}
// c -> b
{
int pour = min(c, B - b);
dfs(a, b + pour, c - pour, target);
}
}
int main() {
int target;
cin >> A >> B >> C >> target;
dfs(A, 0, 0, target); // 假设初始是 A 装满
if (have) cout << "YES" << endl;
else cout << "NO" << endl;
return 0;
}