您的位置:首页 > 其它

USACO 1.4 Mother's Milk

2016-11-02 14:46 465 查看
解题思路

较为经典的搜索,状态为A,B,C中的量,初始为(0,0,C),有六种状态转移方式,用递归即可完成所有方案;

解题要点

1.递归函数,三个变量分别为A中的量 a , B中的量 b ,C中的量 c 。六种转移方式(c->a , c->b, a->b, a->c, b->a, b->c),如果满足条件则进行递归,如果a为0,则找到一组解,记录下来(最后要排序输出)。

void dg(int a,int b,int c)
{
if(a==0)
{
cont++;
ans[cont]=c;
}
if(c>0)
{
if(a<A)
{
int cc=c,aa=a;
pull(cc,aa,A);
if(book[aa][b][cc]==0)
{
book[aa][b][cc]=1;
dg(aa,b,cc);
}
}
if(b<B)
{
int cc=c,bb=b;
pull(cc,bb,B);
if(book[a][bb][cc]==0)
{
book[a][bb][cc]=1;
dg(a,bb,cc);

}
}
}
if(a>0)
{
if(c<C)
{
int cc=c,aa=a;
pull(aa,cc,C);
if(book[aa][b][cc]==0)
{
book[aa][b][cc]=1;
dg(aa,b,cc);

}
}
if(b<B)
{
int aa=a,bb=b;
pull(aa,bb,B);
if(book[aa][bb][c]==0)
{
book[aa][bb][c]=1;
dg(aa,bb,c);

}
}
}
if(b>0)
{
if(a<A)
{
int bb=b,aa=a;
pull(bb,aa,A);
if(book[aa][bb][c]==0)
{
book[aa][bb][c]=1;
dg(aa,bb,c);

}
}
if(c<C)
{
int cc=c,bb=b;
pull(bb,cc,C);
if(book[a][bb][cc]==0)
{
book[a][bb][cc]=1;
dg(a,bb,cc);

}
}
}
return ;
}


3.倾倒的操作,可以用引用操作,自己写一个函数来完成

void pull(int& x,int& y,int& Y)
{
int k=Y-y;
if(k>x)
{
y=y+x;
x=0;
return ;
}
y=Y;
x=x-k;
return;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  搜索 usaco