2 6 3 1 4 1 1 9 3 2 7 1 1
3 -1
参考链接:
http://blog.csdn.net/code_pang/article/details/7802944
http://www.cnblogs.com/jiaolinfengacm/archive/2011/12/15/2288334.html
代码如下:
#include<stdio.h>
#include<string.h>
#include<queue>
using namespace std;
typedef struct {
int cur[3];
int vol[3];
int step;
}node;
node begin,end;
bool visit[1000100];
queue<node>q;
int find(node u,node v)
{
return (u.cur[0]==v.cur[0]&&u.cur[1]==v.cur[1]&&u.cur[2]==v.cur[2]);
}
int check(node u)
{
return (u.cur[0]*10000+u.cur[1]*100+u.cur[2]);
}
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
scanf("%d%d%d",&begin.vol[0],&begin.vol[1],&begin.vol[2]);
begin.cur[0]=begin.vol[0];
begin.cur[1]=begin.cur[2]=0;
scanf("%d%d%d",&end.cur[0],&end.cur[1],&end.cur[2]);
memset(visit,0,sizeof(visit));
q.push(begin);
visit[check(begin)]=1;
int ok=0;
while(!q.empty())
{
node u=q.front();
q.pop();
if(find(u,end))
{
ok=1;
printf("%d\n",u.step);
break;
}
for(int i=0;i<=2;++i)
{
for(int j=0;j<=2;++j)
{
if(i!=j)
{
int min=u.vol[j]-u.cur[j];//允许的剩余空间
if(min>u.cur[i])
min=u.cur[i];//防止出现负值
node v=u;
v.cur[i]-=min;
v.cur[j]+=min;
v.step=u.step+1;
if(!visit[check(v)])
{
visit[check(v)]=1;
q.push(v);
}
}
}
}
}
if(!ok)
{
printf("-1\n");
}
// while(!q.empty())
// q.pop();
}
return 0;
}
原文地址:http://blog.csdn.net/ice_alone/article/details/44902217