#include <cstdio> #include <queue> #include <set> #include <algorithm> #define MAKS 100010 #define mp make_pair using namespace std; typedef long long int lld; int wyn[MAKS]; set<lld> S; queue< pair<lld,int> > q; lld koduj(int* w) { return lld(w[0])*lld(MAKS)*lld(MAKS) + lld(w[1])*lld(MAKS) + lld(w[2]); } void dekoduj(lld v, int* w) { w[2]=v%lld(MAKS); v/=lld(MAKS); w[1]=v%lld(MAKS); v/=lld(MAKS); w[0]=v; } int main() { int poj[3]; scanf("%d %d %d",&poj[0], &poj[1], &poj[2]); int w[3]; scanf("%d %d %d",&w[0], &w[1], &w[2]); for(int i=0;i<=poj[2];i++)wyn[i]=-1; lld vstart=koduj(w); S.insert(vstart); q.push(mp(vstart,0)); while(!q.empty()) { pair<lld, int> p = q.front(); q.pop(); lld v=p.first; int odl=p.second; int b[3]; dekoduj(v, b); for(int i=0;i<3;i++) { if(wyn[b[i]]==-1 || odl<wyn[b[i]])wyn[b[i]]=odl; } for(int i=0;i<3;i++) { for(int j=0;j<3;j++) { if(i==j)continue; int wody=min(b[i], poj[j]-b[j]); if(wody>0) { int bb[3]={b[0], b[1], b[2]}; bb[i]-=wody; bb[j]+=wody; lld u=koduj(bb); if(S.find(u)==S.end()) { q.push(mp(u, odl+1)); S.insert(u); } } } } } for(int i=0;i<=poj[2];i++)printf("%d ",wyn[i]); puts(""); }
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 | #include <cstdio> #include <queue> #include <set> #include <algorithm> #define MAKS 100010 #define mp make_pair using namespace std; typedef long long int lld; int wyn[MAKS]; set<lld> S; queue< pair<lld,int> > q; lld koduj(int* w) { return lld(w[0])*lld(MAKS)*lld(MAKS) + lld(w[1])*lld(MAKS) + lld(w[2]); } void dekoduj(lld v, int* w) { w[2]=v%lld(MAKS); v/=lld(MAKS); w[1]=v%lld(MAKS); v/=lld(MAKS); w[0]=v; } int main() { int poj[3]; scanf("%d %d %d",&poj[0], &poj[1], &poj[2]); int w[3]; scanf("%d %d %d",&w[0], &w[1], &w[2]); for(int i=0;i<=poj[2];i++)wyn[i]=-1; lld vstart=koduj(w); S.insert(vstart); q.push(mp(vstart,0)); while(!q.empty()) { pair<lld, int> p = q.front(); q.pop(); lld v=p.first; int odl=p.second; int b[3]; dekoduj(v, b); for(int i=0;i<3;i++) { if(wyn[b[i]]==-1 || odl<wyn[b[i]])wyn[b[i]]=odl; } for(int i=0;i<3;i++) { for(int j=0;j<3;j++) { if(i==j)continue; int wody=min(b[i], poj[j]-b[j]); if(wody>0) { int bb[3]={b[0], b[1], b[2]}; bb[i]-=wody; bb[j]+=wody; lld u=koduj(bb); if(S.find(u)==S.end()) { q.push(mp(u, odl+1)); S.insert(u); } } } } } for(int i=0;i<=poj[2];i++)printf("%d ",wyn[i]); puts(""); } |