您的位置:首页 > 其它

USACO1.4.2 Mother's Milk (milk3)

2015-01-27 17:45 525 查看
DFS

因为牛奶的总量是不变的,所以可以用a,b,c中的牛奶量做状态,初始状态是(0,0,c)。

每次只能有6种选择,a倒b,a倒c,b倒a,b倒c,c倒a,c倒b,用一个数组vis[i][j][k]判重。

对于每一个答案,判断没有出现过在加入答案。搜索完毕快排,输出即可。

/*
ID:xsy97051
PROB:milk3
LANG:C++
*/
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;

long ans[50],p=-1;
long a,b,c;
bool vis[50][50][50];

bool isIn(long C)
{
bool in=0;
for (long i=0;i<=p;i++)
{
if (ans[i]==C)
{
in=1;
break;
}
}
return in;
}

void dfs(long A,long B,long C)
{
if (vis[A][B][C]) return;
vis[A][B][C]=1;
if (A==0)
{
if(!isIn(C))
{
ans[++p]=C;
}
}
if (A<=b-B) dfs(0,B+A,C);             //A->B
else dfs(A-(b-B),b,C);
if (A<=c-C) dfs(0,B,C+A);             //A->C
else dfs(A-(c-C),B,c);
if (B<=a-A) dfs(A+B,0,C);             //B->A
else dfs(a,B-(a-A),C);
if (B<=c-C) dfs(A,0,C+B);             //B->C
else dfs(A,B-(c-C),c);
if (C<=a-A) dfs(A+C,B,0);             //C->A
else dfs(a,B,C-(a-A));
if (C<=b-B) dfs(A,B+C,0);             //C->B
else dfs(A,b,C-(b-B));
return;
}

int main()
{
freopen("milk3.in","r",stdin);
freopen("milk3.out","w",stdout);
memset(ans,0,sizeof(ans));
memset(vis,0,sizeof(vis));
cin>>a>>b>>c;
dfs(0,0,c);
sort(ans,ans+p+1);
for(long long i=0;i<=p;i++)
{
if (i!=0) cout<<' ';
cout<<ans[i];
}
cout<<endl;
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: