#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(""); } |
English