用bfs , dfs 我做不了
倒水也就6种情况
然后就慢慢模拟了
#include<stdio.h>
#include <algorithm>
#include <string.h>
#include <queue>
using namespace std ;
struct node
{
int a, b , c , cnt ;
void init( int i , int j , int k , int l )
{
a =i , b = j , c = k , cnt = l ;
}
};
int v1 ,v2 ,v3 , e1 , e2 ,e3 ;
int ans , vis[110][110][110] ;
int bfs( )
{
memset( vis , 0 , sizeof(vis) ) ;
queue<node> q ;
node u ;
u.init( v1 , 0 , 0 , 0 ) ;
q.push(u) ;
while ( q.size( ) )
{
node now = q.front( ) ;
q.pop( ) ;
if( now.a == e1 && now.b == e2 ) return now.cnt ;
if(now.a > 0 )
{
if( now.a >= v2 - now.b )
{
if( vis[now.a-v2+now.b][v2][now.c] == 0 )
vis[now.a-v2+now.b][v2][now.c] = 1 , u.init( now.a-v2+now.b , v2 , now.c , now.cnt+1 ) , q.push(u) ;
}
else
{
if( vis[0][now.b+now.a][now.c] == 0 )
vis[0][now.b+now.a][now.c] = 1 , u.init( 0 , now.b+now.a , now.c , now.cnt+1) , q.push(u) ;
}
if( now.a >= v3-now.c )
{
if( vis[now.a-v3+now.c][now.b][v3] == 0 )
vis[now.a-v3+now.c][now.b][v3] = 1 , u.init( now.a-v3+now.c , now.b , v3 ,now.cnt+1 ) , q.push(u) ;
}
else
{
if( vis[0][now.b][now.c+now.a] == 0 )
vis[0][now.b][now.c+now.a] = 1 , u.init( 0 , now.b , now.c+now.a , now.cnt+1) ,q.push(u) ;
}
}
if( now.b > 0 )
{
if( now.b >= v1- now.a )
{
if(vis[v1][now.b-v1+now.a][now.c]==0)
vis[v1][now.b-v1+now.a][now.c]=1 , u.init( v1 , now.b-v1+now.a , now.c ,now.cnt+1 ) , q.push(u) ;
}
else
{
if(vis[now.a+now.b][0][now.c]==0)
vis[now.a+now.b][0][now.c]=1 , u.init( now.a+now.b , 0 , now.c , now.cnt+1 ) , q.push(u) ;
}
if( now.b >= v3-now.c )
{
if( vis[now.a][now.b-v3+now.c][v3] ==0 )
vis[now.a][now.b-v3+now.c][v3] =1 , u.init( now.a , now.b-v3+now.c , v3 , now.cnt+1 ) , q.push(u) ;
}
else
{
if(vis[now.a][0][now.c+now.b]==0)
vis[now.a][0][now.c+now.b]=1 , u.init( now.a , 0 , now.c+now.b , now.cnt+1 ) , q.push(u) ;
}
}
if( now.c > 0 )
{
if( now.c >= v1-now.a )
{
if(vis[v1][now.b][now.c-v1+now.a] == 0 )
vis[v1][now.b][now.c-v1+now.a] =1 , u.init( v1 , now.b , now.c-v1+now.a , now.cnt+1 ) ,q.push(u);
}
else
{
if( vis[now.a+now.c][now.b][0] == 0 )
vis[now.a+now.c][now.b][0] = 1 , u.init( now.a+now.c , now.b , 0 ,now.cnt+1 ) , q.push(u) ;
}
if( now.c >= v2-now.b )
{
if( vis[now.a][v2][now.c-v2+now.b] == 0 )
vis[now.a][v2][now.c-v2+now.b] = 1 , u.init( now.a , v2 , now.c-v2+now.b ,now.cnt+1 ) ,q.push(u) ;
}
else
{
if(vis[now.a][now.c+now.b][0] == 0 )
vis[now.a][now.c+now.b][0] = 1 , u.init( now.a , now.c+now.b , 0 ,now.cnt+1 ) , q.push(u) ;
}
}
}
return -1 ;
}
int main( )
{
int t ;
scanf( "%d" ,&t ) ;
while ( t-- )
{
memset( vis , 0 ,sizeof(vis) ) ;
scanf( "%d%d%d" ,&v1 ,&v2 ,&v3 ) ;
scanf( "%d%d%d" ,&e1 ,&e2 ,&e3 ) ;
if( v1 != e1+e2+e3 ) printf( "-1\n" ) ;
else
printf( "%d\n" ,bfs( ) );
}
return 0 ;
}