nyoj 三个水杯

用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 ;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值