一开始没用数组,没成功。后来确定用深搜后,用数组。出现一个不同的abc状态就记录下来,以免重复。一开始要倒的肯定是c杯,之后出现新状态要递归dfs3次。另外发现algorithm里的copy是原数组在前,输出数组在后的。
#include <iostream> #include <cstdio> #include <cmath> #include <algorithm> #include <vector> #include <iomanip> #include <cstring> #include <map> #include <queue> #include <set> #include <cassert> #include <stack> #define mkp make_pair using namespace std; const double EPS=1e-8; typedef long long lon; const lon SZ=20050,INF=0x7FFFFFFF; int arr[3],vst[SZ]; int maxv[3]; set<int> st; void dfs(int x[],int pos) { //cout<<x[0]<<" "<<x[1]<<" "<<x[2]<<" "<<pos<<endl; vst[x[0]*900+x[1]*30+x[2]]=1; if(x[0]==0)st.insert(x[2]); for(int i=0;i<3;++i) { if(i!=pos) { int newarr[3]; copy(x,x+3,newarr); if(x[pos]+x[i]>maxv[i]) { x[pos]-=(maxv[i]-x[i]); x[i]=maxv[i]; } else { x[i]+=x[pos]; x[pos]=0; } //cout<<x[0]<<" "<<x[1]<<" "<<x[2]<<endl; if(vst[x[0]*900+x[1]*30+x[2]]==0) { dfs(x,0); dfs(x,1); dfs(x,2); } copy(newarr,newarr+3,x); } } } int main() { std::ios::sync_with_stdio(0); //freopen("d:\\1.txt","r",stdin); lon casenum; //cin>>casenum; //for(lon time=1;time<=casenum;++time) { cin>>maxv[0]>>maxv[1]>>maxv[2]; vst[maxv[2]]=1; arr[2]=maxv[2]; dfs(arr,2); for(auto it=st.begin();it!=st.end();++it) { if(it!=st.begin())cout<<" "; cout<<*it; } cout<<endl; } return 0; }