#include<bits/stdc++.h> using namespace std; vector<int> V(3); vector<int> curr(3); int A,B,C, a, b, c; int currtime; struct state { int a, b, c; int time=0; }; void Przelej(int x, int y, int z, vector<vector<int>> &Empty, vector<vector<int>> &Full, queue<state> &Q) { state t; vector<int> vec(3); if(curr[x]+curr[y]<=V[y]) { vec[x]=0; vec[y]=curr[x]+curr[y]; vec[z]=curr[z]; t.time=currtime+1; t.a=vec[0]; t.b=vec[1]; t.c=vec[2]; if(Empty[x][vec[(x+1)%3]]==-1) Q.push(t); return; }else{ vec[x]=(curr[x]-(V[y]-curr[y])); vec[y]=V[y]; vec[z]=curr[z]; t.time=currtime+1; t.a=vec[0]; t.b=vec[1]; t.c=vec[2]; if(Full[y][vec[(y+1)%3]]==-1) Q.push(t); return; } } int main() { cin >> V[0] >> V[1] >> V[2] >> curr[0] >> curr[1] >> curr[2]; queue<state> Q; state temp; temp.a=curr[0]; temp.b=curr[1]; temp.c=curr[2]; temp.time=0; A=V[0]; B=V[1]; C=V[2]; vector<int> time(C+1, -1); vector<vector<int>> Empty(3, vector<int> (C+1, -1)); vector<vector<int>> Full(3, vector<int> (C+1, -1)); Q.push(temp); while(!Q.empty()) { a=Q.front().a; b=Q.front().b; c=Q.front().c; curr[0]=a; curr[1]=b; curr[2]=c; currtime=Q.front().time; Q.pop(); if(time[a]==-1) time[a]=currtime; if(time[b]==-1) time[b]=currtime; if(time[c]==-1) time[c]=currtime; if(a==A) Full[0][b]=currtime; if(b==B) Full[1][c]=currtime; if(c==C) Full[2][a]=currtime; if(a==0) Empty[0][b]=currtime; if(b==0) Empty[1][c]=currtime; if(c==0) Empty[2][a]=currtime; Przelej(0, 1, 2, Empty, Full, Q); Przelej(1, 0, 2, Empty, Full, Q); Przelej(0, 2, 1, Empty, Full, Q); Przelej(2, 0, 1, Empty, Full, Q); Przelej(1, 2, 0, Empty, Full, Q); Przelej(2, 1, 0, Empty, Full, Q); } for(int i=0; i<=C; i++) cout << time[i] << ' '; return 0; }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 | #include<bits/stdc++.h> using namespace std; vector<int> V(3); vector<int> curr(3); int A,B,C, a, b, c; int currtime; struct state { int a, b, c; int time=0; }; void Przelej(int x, int y, int z, vector<vector<int>> &Empty, vector<vector<int>> &Full, queue<state> &Q) { state t; vector<int> vec(3); if(curr[x]+curr[y]<=V[y]) { vec[x]=0; vec[y]=curr[x]+curr[y]; vec[z]=curr[z]; t.time=currtime+1; t.a=vec[0]; t.b=vec[1]; t.c=vec[2]; if(Empty[x][vec[(x+1)%3]]==-1) Q.push(t); return; }else{ vec[x]=(curr[x]-(V[y]-curr[y])); vec[y]=V[y]; vec[z]=curr[z]; t.time=currtime+1; t.a=vec[0]; t.b=vec[1]; t.c=vec[2]; if(Full[y][vec[(y+1)%3]]==-1) Q.push(t); return; } } int main() { cin >> V[0] >> V[1] >> V[2] >> curr[0] >> curr[1] >> curr[2]; queue<state> Q; state temp; temp.a=curr[0]; temp.b=curr[1]; temp.c=curr[2]; temp.time=0; A=V[0]; B=V[1]; C=V[2]; vector<int> time(C+1, -1); vector<vector<int>> Empty(3, vector<int> (C+1, -1)); vector<vector<int>> Full(3, vector<int> (C+1, -1)); Q.push(temp); while(!Q.empty()) { a=Q.front().a; b=Q.front().b; c=Q.front().c; curr[0]=a; curr[1]=b; curr[2]=c; currtime=Q.front().time; Q.pop(); if(time[a]==-1) time[a]=currtime; if(time[b]==-1) time[b]=currtime; if(time[c]==-1) time[c]=currtime; if(a==A) Full[0][b]=currtime; if(b==B) Full[1][c]=currtime; if(c==C) Full[2][a]=currtime; if(a==0) Empty[0][b]=currtime; if(b==0) Empty[1][c]=currtime; if(c==0) Empty[2][a]=currtime; Przelej(0, 1, 2, Empty, Full, Q); Przelej(1, 0, 2, Empty, Full, Q); Przelej(0, 2, 1, Empty, Full, Q); Przelej(2, 0, 1, Empty, Full, Q); Przelej(1, 2, 0, Empty, Full, Q); Przelej(2, 1, 0, Empty, Full, Q); } for(int i=0; i<=C; i++) cout << time[i] << ' '; return 0; } |