p1215

一开始没用数组,没成功。后来确定用深搜后,用数组。出现一个不同的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;
}

 

posted @ 2018-10-20 09:37  degvx  阅读(167)  评论(0)    收藏  举报