思路: 写这个题就是记录一下这个题的思想,说实话我真的没有一点感觉到它是个bfs....还是昊神说是个bfs,交流了一下,一想也确实是个bfs,因为要求步数而且bfs还可以记录出它每一步的状态,还是最少的次数....
#include <iostream>
#include <cstdio>
#include <queue>
#include <cstring>
using namespace std;
int v[3],e[3];
int book[111][111][111];
struct node
{
int w[3];
int s;
}q,p;
void push(int a,int b)
{
if(v[b]-q.w[b]>=q.w[a])
{
q.w[b]+=q.w[a];
q.w[a]=0;
}
else
{
q.w[a]-=v[b]-q.w[b];
q.w[b]=v[b];
}
return ;
}
void bfs()
{
queue<node>Q;
memset(book,0,sizeof(book));
q.w[0]=v[0];
q.w[1]=0;
q.w[2]=0;
q.s=0;
book[v[0]][0][0]=1;
Q.push(q);
while(!Q.empty())
{
//cout<<1<<endl;
p=Q.front();
Q.pop();
if(p.w[0]==e[0]&&p.w[1]==e[1]&&p.w[2]==e[2])
{
cout<<p.s<<endl;
return ;
}
for(int i=0;i<3;i++)
{
for(int j=0;j<3;j++)
{
if(i==j)
continue;
q=p;
push(i,j);
if(!book[q.w[0]][q.w[1]][q.w[2]])
{
q.s++;
Q.push(q);
book[q.w[0]][q.w[1]][q.w[2]]=1;
}
}
}
}
cout<<-1<<endl;
}
int main()
{
int t;
cin>>t;
while(t--)
{
scanf("%d%d%d",&v[0],&v[1],&v[2]);
scanf("%d%d%d",&e[0],&e[1],&e[2]);
bfs();
}
return 0;
}