#include<bits/stdc++.h> #define pb push_back #define mp make_pair #define st first #define nd second #define int long long using namespace std; const int N=1e5+9; int odp[N], ile, odl, zuzyty[N]; struct abc{ int tab[3]; bool operator==(const abc &o) const { return tab[0] == o.tab[0] && tab[1] == o.tab[1] && tab[2] == o.tab[2]; } bool operator<(const abc &o) const { return tab[0]*N*N + tab[1]*N + tab[2] < o.tab[0]*N*N + o.tab[1]*N + o.tab[2]; } }; struct pojemnosc{ int tab[3]; }; map<abc, bool> odw; int32_t main(){ ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); pojemnosc poj; abc stan; for(int i=0; i<3; i++) cin>>poj.tab[i]; for(int i=0; i<3; i++) cin>>stan.tab[i]; queue<pair<abc, int>> q; q.push(mp(stan, 0)); odw[stan]=1; while(!q.empty()){ stan=q.front().st; odl=q.front().nd; //if(odl>wartownik) //break; //for(int i=0; i<3; i++) //cout<<stan.tab[i]<<" "; //cout<<"\n"; for(int i=0; i<3; i++){ if(!zuzyty[stan.tab[i]]){ odp[stan.tab[i]]=odl; zuzyty[stan.tab[i]]=1; } else odp[stan.tab[i]]=min(odp[stan.tab[i]], odl); } for(int i=0; i<3; i++){ for(int j=0; j<3; j++){ abc kopia=stan; if(i==j) continue; ile=min(kopia.tab[i], poj.tab[j]-kopia.tab[j]); //cout<<"przelewam "<<ile<<" z "<<kopia.tab[i]<<" do "<<kopia.tab[j]<<"\n"; kopia.tab[i]-=ile; kopia.tab[j]+=ile; if(!odw[kopia]){ //cout<<"!!!dodaje do kolejki "; //for(int i=0; i<3; i++) //cout<<kopia.tab[i]<<" "; //cout<<"\n"; q.push(mp(kopia, odl+1)); odw[kopia]=1; } } } q.pop(); } for(int i=1; i<=poj.tab[2]+1; i++){ if(zuzyty[i-1]) cout<<odp[i-1]<<" "; else cout<<"-1 "; } cout<<"\n"; 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 | #include<bits/stdc++.h> #define pb push_back #define mp make_pair #define st first #define nd second #define int long long using namespace std; const int N=1e5+9; int odp[N], ile, odl, zuzyty[N]; struct abc{ int tab[3]; bool operator==(const abc &o) const { return tab[0] == o.tab[0] && tab[1] == o.tab[1] && tab[2] == o.tab[2]; } bool operator<(const abc &o) const { return tab[0]*N*N + tab[1]*N + tab[2] < o.tab[0]*N*N + o.tab[1]*N + o.tab[2]; } }; struct pojemnosc{ int tab[3]; }; map<abc, bool> odw; int32_t main(){ ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); pojemnosc poj; abc stan; for(int i=0; i<3; i++) cin>>poj.tab[i]; for(int i=0; i<3; i++) cin>>stan.tab[i]; queue<pair<abc, int>> q; q.push(mp(stan, 0)); odw[stan]=1; while(!q.empty()){ stan=q.front().st; odl=q.front().nd; //if(odl>wartownik) //break; //for(int i=0; i<3; i++) //cout<<stan.tab[i]<<" "; //cout<<"\n"; for(int i=0; i<3; i++){ if(!zuzyty[stan.tab[i]]){ odp[stan.tab[i]]=odl; zuzyty[stan.tab[i]]=1; } else odp[stan.tab[i]]=min(odp[stan.tab[i]], odl); } for(int i=0; i<3; i++){ for(int j=0; j<3; j++){ abc kopia=stan; if(i==j) continue; ile=min(kopia.tab[i], poj.tab[j]-kopia.tab[j]); //cout<<"przelewam "<<ile<<" z "<<kopia.tab[i]<<" do "<<kopia.tab[j]<<"\n"; kopia.tab[i]-=ile; kopia.tab[j]+=ile; if(!odw[kopia]){ //cout<<"!!!dodaje do kolejki "; //for(int i=0; i<3; i++) //cout<<kopia.tab[i]<<" "; //cout<<"\n"; q.push(mp(kopia, odl+1)); odw[kopia]=1; } } } q.pop(); } for(int i=1; i<=poj.tab[2]+1; i++){ if(zuzyty[i-1]) cout<<odp[i-1]<<" "; else cout<<"-1 "; } cout<<"\n"; return 0; } |