Altered
This commit is contained in:
		
							
								
								
									
										63
									
								
								Algorithm/DS-Related/Graph/DFS/UVa10603-Fill.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										63
									
								
								Algorithm/DS-Related/Graph/DFS/UVa10603-Fill.cpp
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,63 @@
 | 
			
		||||
#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; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
 | 
			
		||||
 | 
			
		||||
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);
 | 
			
		||||
 | 
			
		||||
    // <20><><EFBFBD>ֵ<EFBFBD>ˮ<EFBFBD><CBAE><EFBFBD><EFBFBD>
 | 
			
		||||
    // 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); // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼ<EFBFBD><CABC> A װ<><D7B0>
 | 
			
		||||
    if (have) cout << "YES" << endl;
 | 
			
		||||
    else cout << "NO" << endl;
 | 
			
		||||
    return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
		Reference in New Issue
	
	Block a user