您的位置:首页 > 其它

USACO Section 1.4 Mother's Milk

2012-02-08 14:25 330 查看
DFS最容易理解,visited[A][B][C]表示a,b,c三桶此种状态有没有被搜索过,ans存放符合条件时,c桶的状态。对于每一个状态,下一状态有六种可能,详见代码中注释

/*
ID:linyvxi1
PROG:milk3
LANG:C++
*/
#include <stdio.h>
#include <algorithm>
#include <stdlib.h>
#include <string.h>
using namespace std;
long ans[50],p=-1;
long a,b,c;
bool visited[50][50][50];

bool check(long C)
{
int i;
for(i=0;i<=p;i++){
if(ans[i]==C){
return true;
}
}
return false;
}

void DFS(long A,long B,long C)
{
if(visited[A][B][C])
return;
visited[A][B][C]=true;
if(A==0){
if(!check(C)){
ans[++p]=C;
}
}

if(A<=b-B){
DFS(0,B+A,C);
}else    DFS(A-(b-B),b,C);//A->B
if(A<=c-C){
DFS(0,B,C+A);
}else    DFS(A-(c-C),B,c);//A->C
if(B<=a-A){
DFS(A+B,0,C);
}else    DFS(a,B-(a-A),C);//B->A
if(B<=c-C){
DFS(A,0,C+B);
}else    DFS(A,B-(c-C),c);//B->C
if(C<=a-A){
DFS(A+C,B,0);
}else    DFS(a,B,C-(a-A));//C->A
if(C<=b-B){
DFS(A,B+C,0);
}else    DFS(A,b,C-(b-B));//C->B

}

int main()
{
memset(ans,0,sizeof(ans));
memset(visited,0,sizeof(visited));

FILE* fin=fopen("milk3.in","r");
FILE* fout=fopen("milk3.out","w");

fscanf(fin,"%d%d%d",&a,&b,&c);
DFS(0,0,c);
sort(ans,ans+p+1);
int i;
for(i=0;i<=p;i++){
if(i)
fprintf(fout," ");
fprintf(fout,"%d",ans[i]);
}
fprintf(fout,"\n");
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: