#include<iostream>
#include<queue>
#include<utility>
#include<map>
using namespace std;
queue<pair<pair<int,int>,pair<int,int> > > kolejka;
int wyniki[1000000];
map<pair<int,pair<int,int> >,int> mapka;
map<pair<int,pair<int,int> >,int>::iterator it;
int main()
{
cin.tie(0);
cout.tie(0);
ios_base::sync_with_stdio(0);
int a,b,c,a1,b1,c1;
cin>>a>>b>>c>>a1>>b1>>c1;
for(int i=0;i<=c;i++)
wyniki[i]=-1;
kolejka.push(make_pair(make_pair(a1,b1),make_pair(c1,0)));
while(!kolejka.empty())
{
pair<pair<int,int>,pair<int,int> > para;
para=kolejka.front();
kolejka.pop();
int x=para.first.first;
int y=para.first.second;
int z=para.second.first;
int koszt=para.second.second;
it=mapka.find(make_pair(x,make_pair(y,z)));
if(it!=mapka.end())
continue;
//cout<<x<<" "<<y<<" "<<z<<"\n";
mapka[make_pair(x,make_pair(y,z))]=1;
if(wyniki[z]==-1)
wyniki[z]=koszt;
if(wyniki[x]==-1)
wyniki[x]=koszt;
if(wyniki[y]==-1)
wyniki[y]=koszt;
it=mapka.find(make_pair(min(a,x+y),make_pair(y-(min(a,x+y)-x),z)));
if(it==mapka.end())
kolejka.push(make_pair(make_pair(min(a,x+y),y-(min(a,x+y)-x)),make_pair(z,koszt+1)));
it=mapka.find(make_pair(x-(min(b,x+y)-y),make_pair(min(b,x+y),z)));
if(it==mapka.end())
kolejka.push(make_pair(make_pair(x-(min(b,x+y)-y),min(b,x+y)),make_pair(z,koszt+1)));
it=mapka.find(make_pair(min(a,x+z),make_pair(y,z-(min(a,x+z)-x))));
if(it==mapka.end())
kolejka.push(make_pair(make_pair(min(a,x+z),y),make_pair(z-(min(a,x+z)-x),koszt+1)));
it=mapka.find(make_pair(x-(min(c,x+z)-z),make_pair(y,min(c,x+z))));
if(it==mapka.end())
kolejka.push(make_pair(make_pair(x-(min(c,x+z)-z),y),make_pair(min(c,x+z),koszt+1)));
it=mapka.find(make_pair(x,make_pair(min(b,y+z),z-(min(b,y+z)-y))));
if(it==mapka.end())
kolejka.push(make_pair(make_pair(x,min(b,y+z)),make_pair(z-(min(b,y+z)-y),koszt+1)));
it=mapka.find(make_pair(x,make_pair(y-(min(c,y+z)-z),min(c,y+z))));
if(it==mapka.end())
kolejka.push(make_pair(make_pair(x,y-(min(c,y+z)-z)),make_pair(min(c,y+z),koszt+1)));
}
for(int i=0;i<=c;i++)
cout<<wyniki[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 | #include<iostream> #include<queue> #include<utility> #include<map> using namespace std; queue<pair<pair<int,int>,pair<int,int> > > kolejka; int wyniki[1000000]; map<pair<int,pair<int,int> >,int> mapka; map<pair<int,pair<int,int> >,int>::iterator it; int main() { cin.tie(0); cout.tie(0); ios_base::sync_with_stdio(0); int a,b,c,a1,b1,c1; cin>>a>>b>>c>>a1>>b1>>c1; for(int i=0;i<=c;i++) wyniki[i]=-1; kolejka.push(make_pair(make_pair(a1,b1),make_pair(c1,0))); while(!kolejka.empty()) { pair<pair<int,int>,pair<int,int> > para; para=kolejka.front(); kolejka.pop(); int x=para.first.first; int y=para.first.second; int z=para.second.first; int koszt=para.second.second; it=mapka.find(make_pair(x,make_pair(y,z))); if(it!=mapka.end()) continue; //cout<<x<<" "<<y<<" "<<z<<"\n"; mapka[make_pair(x,make_pair(y,z))]=1; if(wyniki[z]==-1) wyniki[z]=koszt; if(wyniki[x]==-1) wyniki[x]=koszt; if(wyniki[y]==-1) wyniki[y]=koszt; it=mapka.find(make_pair(min(a,x+y),make_pair(y-(min(a,x+y)-x),z))); if(it==mapka.end()) kolejka.push(make_pair(make_pair(min(a,x+y),y-(min(a,x+y)-x)),make_pair(z,koszt+1))); it=mapka.find(make_pair(x-(min(b,x+y)-y),make_pair(min(b,x+y),z))); if(it==mapka.end()) kolejka.push(make_pair(make_pair(x-(min(b,x+y)-y),min(b,x+y)),make_pair(z,koszt+1))); it=mapka.find(make_pair(min(a,x+z),make_pair(y,z-(min(a,x+z)-x)))); if(it==mapka.end()) kolejka.push(make_pair(make_pair(min(a,x+z),y),make_pair(z-(min(a,x+z)-x),koszt+1))); it=mapka.find(make_pair(x-(min(c,x+z)-z),make_pair(y,min(c,x+z)))); if(it==mapka.end()) kolejka.push(make_pair(make_pair(x-(min(c,x+z)-z),y),make_pair(min(c,x+z),koszt+1))); it=mapka.find(make_pair(x,make_pair(min(b,y+z),z-(min(b,y+z)-y)))); if(it==mapka.end()) kolejka.push(make_pair(make_pair(x,min(b,y+z)),make_pair(z-(min(b,y+z)-y),koszt+1))); it=mapka.find(make_pair(x,make_pair(y-(min(c,y+z)-z),min(c,y+z)))); if(it==mapka.end()) kolejka.push(make_pair(make_pair(x,y-(min(c,y+z)-z)),make_pair(min(c,y+z),koszt+1))); } for(int i=0;i<=c;i++) cout<<wyniki[i]<<" "; return 0; } |
English