一开始没用数组,没成功。后来确定用深搜后,用数组。出现一个不同的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-;
typedef long long lon;
const lon SZ=,INF=0x7FFFFFFF;
int arr[],vst[SZ];
int maxv[];
set<int> st; void dfs(int x[],int pos)
{
//cout<<x[0]<<" "<<x[1]<<" "<<x[2]<<" "<<pos<<endl;
vst[x[]*+x[]*+x[]]=;
if(x[]==)st.insert(x[]);
for(int i=;i<;++i)
{
if(i!=pos)
{
int newarr[];
copy(x,x+,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]=;
}
//cout<<x[0]<<" "<<x[1]<<" "<<x[2]<<endl;
if(vst[x[]*+x[]*+x[]]==)
{
dfs(x,);
dfs(x,);
dfs(x,);
}
copy(newarr,newarr+,x);
}
}
} int main()
{
std::ios::sync_with_stdio();
//freopen("d:\\1.txt","r",stdin);
lon casenum;
//cin>>casenum;
//for(lon time=1;time<=casenum;++time)
{
cin>>maxv[]>>maxv[]>>maxv[];
vst[maxv[]]=;
arr[]=maxv[];
dfs(arr,);
for(auto it=st.begin();it!=st.end();++it)
{
if(it!=st.begin())cout<<" ";
cout<<*it;
}
cout<<endl;
}
return ;
}
05-11 13:49