uscao Mother's Milk

bfs吧,我做过一题非常可乐跟这题很像。就是每次把牛奶在两个杯子中互倒,找到所有情况把a==0这个情况下的c保存起来(可能不同状态下的c相同用vis标记)。

/*
ID: jinbo wu
LANG: C++
TASK: milk3
*/
#include<bits/stdc++.h>
using namespace std;
bool v[25][25][25];
bool vis[25];
struct l
{
int a,b,c;
};
int A,B,C;
int ans[25];
int len;
queue<l> q2; 
void bfs()
{
l t1,t2;
len=0;
t1.a=0,t1.b=0,t1.c=C;
q2.push(t1);
while(!q2.empty())
{
t2=q2.front();
q2.pop();
if(t2.a==0)
{
if(!vis[t2.c])
{
ans[len++]=t2.c;
vis[t2.c]=1;
   }
}
//a-b
int temp=min(t2.a,B-t2.b);
t1.a=t2.a-temp,t1.b=t2.b+temp,t1.c=t2.c;
if(!v[t1.a][t1.b][t1.c])
{
q2.push(t1);
v[t1.a][t1.b][t1.c]=1;
   }
//b-a
temp=min(t2.b,A-t2.a);
t1.a=t2.a+temp,t1.b=t2.b-temp,t1.c=t2.c;
if(!v[t1.a][t1.b][t1.c])
{
 q2.push(t1);
 v[t1.a][t1.b][t1.c]=1;
   }
   //a-c
    temp=min(t2.a,C-t2.c);
    t1.a=t2.a-temp,t1.c=t2.c+temp,t1.b=t2.b;
   if(!v[t1.a][t1.b][t1.c])
{
q2.push(t1);
v[t1.a][t1.b][t1.c]=1;
   }
   //c-a
   temp=min(t2.c,A-t2.a);
   t1.a=t2.a+temp,t1.c=t2.c-temp,t1.b=t2.b;
   if(!v[t1.a][t1.b][t1.c])
{
q2.push(t1);
v[t1.a][t1.b][t1.c]=1;
   }
//b-c
temp=min(t2.b,C-t2.c);
t1.b=t2.b-temp,t1.c=t2.c+temp,t1.a=t2.a;
if(!v[t1.a][t1.b][t1.c])
{
q2.push(t1);
v[t1.a][t1.b][t1.c]=1;
   }
   //c-b
    temp=min(t2.c,B-t2.b);
   t1.b=t2.b+temp,t1.c=t2.c-temp,t1.a=t2.a;
   if(!v[t1.a][t1.b][t1.c])
{
q2.push(t1);
v[t1.a][t1.b][t1.c]=1;
   } 
}

}
int main()
{
int a,b,c;
freopen("milk3.in","r",stdin);
freopen("milk3.out","w",stdout);
scanf("%d %d %d",&A,&B,&C);
bfs();
sort(ans,ans+len);
for(int i=0;i<len-1;i++)
printf("%d ",ans[i]);
printf("%d\n",ans[len-1]);

 }



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值