USACO Section 1.4 Mother's Milk

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

 1 /*
2 ID:linyvxi1
3 PROG:milk3
4 LANG:C++
5 */
6 #include <stdio.h>
7 #include <algorithm>
8 #include <stdlib.h>
9 #include <string.h>
10 using namespace std;
11 long ans[50],p=-1;
12 long a,b,c;
13 bool visited[50][50][50];
14
15 bool check(long C)
16 {
17 int i;
18 for(i=0;i<=p;i++){
19 if(ans[i]==C){
20 return true;
21 }
22 }
23 return false;
24 }
25
26 void DFS(long A,long B,long C)
27 {
28 if(visited[A][B][C])
29 return;
30 visited[A][B][C]=true;
31 if(A==0){
32 if(!check(C)){
33 ans[++p]=C;
34 }
35 }
36
37 if(A<=b-B){
38 DFS(0,B+A,C);
39 }else DFS(A-(b-B),b,C);//A->B
40 if(A<=c-C){
41 DFS(0,B,C+A);
42 }else DFS(A-(c-C),B,c);//A->C
43 if(B<=a-A){
44 DFS(A+B,0,C);
45 }else DFS(a,B-(a-A),C);//B->A
46 if(B<=c-C){
47 DFS(A,0,C+B);
48 }else DFS(A,B-(c-C),c);//B->C
49 if(C<=a-A){
50 DFS(A+C,B,0);
51 }else DFS(a,B,C-(a-A));//C->A
52 if(C<=b-B){
53 DFS(A,B+C,0);
54 }else DFS(A,b,C-(b-B));//C->B
55
56
57 }
58
59 int main()
60 {
61 memset(ans,0,sizeof(ans));
62 memset(visited,0,sizeof(visited));
63
64 FILE* fin=fopen("milk3.in","r");
65 FILE* fout=fopen("milk3.out","w");
66
67 fscanf(fin,"%d%d%d",&a,&b,&c);
68 DFS(0,0,c);
69 sort(ans,ans+p+1);
70 int i;
71 for(i=0;i<=p;i++){
72 if(i)
73 fprintf(fout," ");
74 fprintf(fout,"%d",ans[i]);
75 }
76 fprintf(fout,"\n");
77 return 0;
78 }



原文地址:https://www.cnblogs.com/yangce/p/2342651.html