Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*
- ID: mickyta1
- TASK: milk3
- LANG: C++
- */
- #include <bits/stdc++.h>
- using namespace std;
- typedef tuple<int, int, int> tiii;
- const int N = 20 + 5;
- vector<int> ans;
- int limA, limB, limC;
- bool visit[6][N][N];
- bool &visited(int a, int b, int c){
- if(a == 0){
- return visit[0][b][c];
- } else if(a == limA){
- return visit[1][b][c];
- } else if(b == 0){
- return visit[2][a][c];
- } else if(b == limB){
- return visit[3][a][c];
- } else if(c == 0){
- return visit[4][a][b];
- }
- return visit[5][a][b];
- }
- int main(){
- freopen("milk3.in", "r", stdin);
- freopen("milk3.out", "w", stdout);
- scanf("%d%d%d", &limA, &limB, &limC);
- queue<tiii> que;
- visited(0, 0, limC) = true;
- que.emplace(0, 0, limC);
- while(!que.empty()){
- int ua = get<0>(que.front());
- int ub = get<1>(que.front());
- int uc = get<2>(que.front());
- que.pop();
- if(ua == 0){
- ans.push_back(uc);
- }
- int va, vb, vc, mve;
- for(int i = 1; i <= 6; ++i){
- va = ua;
- vb = ub;
- vc = uc;
- if(i == 1){ // A -> B
- mve = min(ua, limB - ub);
- va -= mve;
- vb += mve;
- } else if(i == 2){ // B -> A
- mve = min(ub, limA - ua);
- vb -= mve;
- va += mve;
- } else if(i == 3){ // A -> C
- mve = min(ua, limC - uc);
- va -= mve;
- vc += mve;
- } else if(i == 4){ // C -> A
- mve = min(uc, limA - ua);
- vc -= mve;
- va += mve;
- } else if(i == 5){ // B -> C
- mve = min(ub, limC - uc);
- vb -= mve;
- vc += mve;
- } else { // C -> B
- mve = min(uc, limB - ub);
- vc -= mve;
- vb += mve;
- }
- if(!visited(va, vb, vc)){
- visited(va, vb, vc) = true;
- que.emplace(va, vb, vc);
- }
- }
- }
- sort(ans.begin(), ans.end());
- for(int i = 0; i < (int)ans.size() - 1; ++i){
- cout << ans[i] << ' ';
- }
- cout << ans.back() << '\n';
- fclose(stdin);
- fclose(stdout);
- return 0;
- }
Advertisement
RAW Paste Data
Copied
Advertisement