解题思路
较为经典的搜索,状态为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;
}