USACO sec1.4 Mother's Milk

BFS

 1 /*
 2 PROG : milk3
 3 LANG : C++
 4 */
 5 # include <stdio.h>
 6 
 7 # define MAXN 20005
 8 
 9 /**********************************************/
10 int a[3], c[3], ss;
11 char vis[MAXN];
12 int Q[MAXN], front, rear;
13 int sol[25];
14 
15 void cal(int s)
16 {
17     a[0] = s%21;
18     a[1] = s/21%21;
19     a[2] = s/(21*21);
20 }
21 
22 int rcal(void)
23 {
24     return a[0]+a[1]*21+a[2]*21*21;
25 }
26 
27 /* x --> y */
28 void pour(int x, int y, int s)
29 {
30     int nst;
31     cal(s);
32     if (a[x]+a[y] <= c[y])
33         a[y] += a[x], a[x] = 0;
34     else
35         a[x] -= (c[y]-a[y]), a[y] = c[y];
36         
37     nst = rcal();
38     if (!vis[nst])
39     {
40         Q[rear++] = nst;
41         vis[nst] = 1;
42         if (!a[0]) sol[a[2]] = 1;
43     }
44 }
45 
46 void bfs(void)
47 {
48     int cur;
49     
50     front = 1, rear = 2;
51     Q[1] = ss, vis[ss] = 1;
52     while (front < rear)
53     {
54         cur = Q[front++];
55         pour(0, 1, cur), pour(1, 0, cur);
56         pour(1, 2, cur), pour(2, 1, cur);
57         pour(0, 2, cur), pour(2, 0, cur);
58     }
59 }
60 /**********************************************/
61 void solve()
62 {
63     int i, first = 1;
64     scanf("%d%d%d", &c[0], &c[1], &c[2]);
65     a[0] = a[1] = 0, a[2] = c[2];
66     ss = rcal();
67     for (i = 0; i <= 21; ++i) sol[i] = 0;
68     bfs();
69     sol[c[2]] = 1;
70     for (i = 0; i <= 21; ++i) if (sol[i])
71     {
72         if (first)
73             first = 0, printf("%d", i);
74         else
75             printf(" %d", i);
76     }
77     putchar('\n');
78 }
79 
80 int main()
81 {
82     freopen("milk3.in", "r", stdin);
83     freopen("milk3.out", "w", stdout);
84     
85     solve();
86     
87     fclose(stdin);
88     fclose(stdout);
89     
90     return 0;
91 }
原文地址:https://www.cnblogs.com/JMDWQ/p/2648540.html