#include <iostream> #include <vector> #include <queue> #include <algorithm> #include <set> int zaw[3]; int poj[3]; int sta[3]; int sol[100001]; struct state{ int poj[3]; state(int a,int b,int c){ poj[0]=(a); poj[1]=(b); poj[2]=(c); }; }; bool operator<(const state& a, const state& b) { if(a.poj[0]==b.poj[0]){ return a.poj[1]<b.poj[1]; } return (a.poj[0]<b.poj[0]); } std::set<state> odwiedzone; std::vector<state>act; void check(int a,int b,int c){ //std::cout<<"check "<<a<<" "<<b<<" "<<c<<std::endl; state x(a,b,c); if(odwiedzone.count(x)==0){ //std::cout<<"new"<<std::endl; odwiedzone.insert(x); act.push_back(x); } } int main(){ std::ios_base::sync_with_stdio(0); std::cin>>poj[0]>>poj[1]>>poj[2]; std::cin>>zaw[0]>>zaw[1]>>zaw[2]; act.emplace_back(zaw[0],zaw[1],zaw[2]); odwiedzone.emplace(zaw[0],zaw[1],zaw[2]); for(int i=0;i<=poj[2];i++) sol[i]=1e9; int i=0; int res=0; while(i<act.size()){ int j=act.size(); for(;i<j;i++){ //std::cout<<res<<" "<<act[i].poj[0]<<" "<<act[i].poj[1]<<" "<<act[i].poj[2]<<std::endl; for(int k=0;k<3;k++) sol[act[i].poj[k]]=std::min(sol[act[i].poj[k]],res); for(int z=0;z<3;z++) for(int d=0;d<3;d++) if(z!=d){ sta[d]=std::min(act[i].poj[z]+act[i].poj[d],poj[d]); sta[z]=act[i].poj[z]+act[i].poj[d]-sta[d]; sta[3-z-d]=act[i].poj[3-z-d]; check(sta[0],sta[1],sta[2]); } } res++; } for(int i=0;i<=poj[2];i++) std::cout<<(sol[i]<1e9?sol[i]:-1)<<" "; std::cout<<std::endl; 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 | #include <iostream> #include <vector> #include <queue> #include <algorithm> #include <set> int zaw[3]; int poj[3]; int sta[3]; int sol[100001]; struct state{ int poj[3]; state(int a,int b,int c){ poj[0]=(a); poj[1]=(b); poj[2]=(c); }; }; bool operator<(const state& a, const state& b) { if(a.poj[0]==b.poj[0]){ return a.poj[1]<b.poj[1]; } return (a.poj[0]<b.poj[0]); } std::set<state> odwiedzone; std::vector<state>act; void check(int a,int b,int c){ //std::cout<<"check "<<a<<" "<<b<<" "<<c<<std::endl; state x(a,b,c); if(odwiedzone.count(x)==0){ //std::cout<<"new"<<std::endl; odwiedzone.insert(x); act.push_back(x); } } int main(){ std::ios_base::sync_with_stdio(0); std::cin>>poj[0]>>poj[1]>>poj[2]; std::cin>>zaw[0]>>zaw[1]>>zaw[2]; act.emplace_back(zaw[0],zaw[1],zaw[2]); odwiedzone.emplace(zaw[0],zaw[1],zaw[2]); for(int i=0;i<=poj[2];i++) sol[i]=1e9; int i=0; int res=0; while(i<act.size()){ int j=act.size(); for(;i<j;i++){ //std::cout<<res<<" "<<act[i].poj[0]<<" "<<act[i].poj[1]<<" "<<act[i].poj[2]<<std::endl; for(int k=0;k<3;k++) sol[act[i].poj[k]]=std::min(sol[act[i].poj[k]],res); for(int z=0;z<3;z++) for(int d=0;d<3;d++) if(z!=d){ sta[d]=std::min(act[i].poj[z]+act[i].poj[d],poj[d]); sta[z]=act[i].poj[z]+act[i].poj[d]-sta[d]; sta[3-z-d]=act[i].poj[3-z-d]; check(sta[0],sta[1],sta[2]); } } res++; } for(int i=0;i<=poj[2];i++) std::cout<<(sol[i]<1e9?sol[i]:-1)<<" "; std::cout<<std::endl; return 0; } |