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; }
相关文章推荐
- USACO Section 1.4 packrec
- USACO Section 1.4 The Clocks
- USACO Section 1.4 Arithmetic Progressions
- USACO Section 1.4 Arithmetic Progressions 解题报告
- USACO-Section1.4 Wormholes(枚举法)
- USACO Section 1.4: Mother's Milk
- USACO Section 1.4 Mother's Milk - 输出错了好几次..
- USACO Section 1.4 Packing Rectangles(枚举)
- USACO Section 1.4 Packing Rectangles
- USACO-Section1.4 Mixing Milk (贪心算法)
- USACO-Section1.4 Arithmetic Progressions
- USACO 之 Section 1.4 More Search Techniques (已解决)
- USACO-Section1.4 Mother's Milk
- USACO-Section1.4 Ski Course Design (枚举)
- USACO Section 1.4 题解
- [USACO Training] Section 1.4
- USACO Section 1.4 Arithmetic Progressions (ariprog)
- usaco.section1.4 && 1.5(2015.11.12)
- USACO-Section1.4 Combination Lock (枚举)
- USACO-Section1.4 Arithmetic Progressions[...]