USACO 1.4 Mother's Milk(BFS)

以前做过类似的,写的很复杂,搞了一晚上。。2Y。

  1 /*
  2 ID: cuizhe
  3 LANG: C++
  4 TASK: milk3
  5 */
  6 #include <cstdio>
  7 #include <cstring>
  8 #include <cmath>
  9 #include <algorithm>
 10 using namespace std;
 11 #define LL long long
 12 int p[31][31][31];
 13 int qua[1000],qub[1000],quc[1000];
 14 int o[100];
 15 int main()
 16 {
 17     int a,b,c,i,j,str,end,num;
 18     freopen("milk3.in","r",stdin);
 19     freopen("milk3.out","w",stdout);
 20     scanf("%d%d%d",&a,&b,&c);
 21     memset(p,0,sizeof(p));
 22     qua[1] = 0;qub[1] = 0;quc[1] = c;
 23     str = end = num = 1;
 24     p[0][0][c] = 1;
 25     while(str <= end)
 26     {
 27         j = 1;
 28         for(i = str;i <= end;i ++)
 29         {
 30             if(qua[i] != 0)
 31             {
 32                 if(qub[i]+qua[i] <= b&&!p[0][qub[i]+qua[i]][quc[i]])
 33                 {
 34                     qua[end+j] = 0;
 35                     qub[end+j] = qub[i]+qua[i];
 36                     quc[end+j] = quc[i];
 37                     p[0][qub[i]+qua[i]][quc[i]] = 1;
 38                     j ++;
 39                 }
 40                 else if(qub[i]+qua[i] > b&&!p[qua[i]-(b-qub[i])][b][quc[i]])
 41                 {
 42                     qua[end+j] = qua[i]-(b-qub[i]);
 43                     qub[end+j] = b;
 44                     quc[end+j] = quc[i];
 45                     p[qua[i]-(b-qub[i])][b][quc[i]] = 1;
 46                     j ++;
 47                 }
 48                 if(quc[i]+qua[i] <= c&&!p[0][qub[i]][quc[i]+qua[i]])
 49                 {
 50                     qua[end+j] = 0;
 51                     qub[end+j] = qub[i];
 52                     quc[end+j] = quc[i]+qua[i];
 53                     p[0][qub[i]][quc[i]+qua[i]] = 1;
 54                     j ++;
 55                 }
 56                 else if(quc[i]+qua[i] > c&&!p[qua[i]-(c-quc[i])][qub[i]][c])
 57                 {
 58                     qua[end+j] = qua[i]-(c-quc[i]);
 59                     qub[end+j] = qub[i];
 60                     quc[end+j] = c;
 61                     p[qua[i]-(c-quc[i])][qub[i]][c] = 1;
 62                     j ++;
 63                 }
 64             }
 65             if(qub[i] != 0)
 66             {
 67                 if(qub[i]+qua[i] <= a&&!p[qub[a]+qua[i]][0][quc[i]])
 68                 {
 69                     p[qub[a]+qua[i]][0][quc[i]] = 1;
 70                     qua[end+j] = qua[i]+qub[i];
 71                     qub[end+j] = 0;
 72                     quc[end+j] = quc[i];
 73                     j ++;
 74                 }
 75                 else if(qub[i]+qua[i] > a&&!p[a][qub[i]-(a-qua[i])][quc[i]])
 76                 {
 77                     p[a][qub[i]-(a-qua[i])][quc[i]] = 1;
 78                     qua[end+j] = a;
 79                     qub[end+j] = qub[i]-(a-qua[i]);
 80                     quc[end+j] = quc[i];
 81                     j ++;
 82                 }
 83                 if(qub[i]+quc[i] <= c&&!p[qua[i]][0][quc[i]+qub[i]])
 84                 {
 85                     p[qua[i]][0][quc[i]+qub[i]] = 1;
 86                     qua[end+j] = qua[i];
 87                     qub[end+j] = 0;
 88                     quc[end+j] = qub[i]+quc[i];
 89                     j ++;
 90                 }
 91                 else if(qub[i]+quc[i] > c&&!p[qua[i]][qub[i]-(c-quc[i])][c])
 92                 {
 93                     p[qua[i]][qub[i]-(c-quc[i])][c] = 1;
 94                     qua[end+j] = qua[i];
 95                     qub[end+j] = qub[i]-(c-quc[i]);
 96                     quc[end+j] = c;
 97                     j ++;
 98                 }
 99             }
100             if(quc[i] != 0)
101             {
102                 if(quc[i]+qua[i] <= a&&!p[qua[i]+quc[i]][qub[i]][0])
103                 {
104                     p[qua[i]+quc[i]][qub[i]][0] = 1;
105                     qua[end+j] = quc[i]+qua[i];
106                     qub[end+j] = qub[i];
107                     quc[end+j] = 0;
108                     j ++;
109                 }
110                 else if(quc[i]+qua[i] > a&&!p[a][qub[i]][quc[i]-(a-qua[i])])
111                 {
112                     p[a][qub[i]][quc[i]-(a-qua[i])] = 1;
113                     qua[end+j] = a;
114                     qub[end+j] = qub[i];
115                     quc[end+j] = quc[i]-(a-qua[i]);
116                     j ++;
117                 }
118                 if(quc[i]+qub[i] <= b&&!p[qua[i]][qub[i]+quc[i]][0])
119                 {
120                     p[qua[i]][qub[i]+quc[i]][0] = 1;
121                     qua[end+j] = qua[i];
122                     qub[end+j] = qub[i]+quc[i];
123                     quc[end+j] = 0;
124                     j ++;
125                 }
126                 else if(quc[i]+qub[i] > b&&!p[qua[i]][b][quc[i]-(b-qub[i])])
127                 {
128                     p[qua[i]][b][quc[i]-(b-qub[i])] = 1;
129                     qua[end+j] = qua[i];
130                     qub[end+j] = b;
131                     quc[end+j] = quc[i]-(b-qub[i]);
132                     j ++;
133                 }
134             }
135         }
136         str = end+1;
137         end = end+j-1;
138     }
139     int z = 1;
140     for(i = 0;i <= c;i ++)
141     {
142         for(j = 0;j <= b;j ++)
143         {
144             if(p[0][j][i]&&!o[i])
145             {
146                 if(z)
147                 {
148                     printf("%d",i);
149                     z = 0;
150                 }
151                 else
152                 printf(" %d",i);
153                 o[i] = 1;
154             }
155         }
156     }
157     printf("\n");
158     return 0;
159 }

转载于:https://www.cnblogs.com/naix-x/archive/2012/11/01/2750382.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值