POJ 3414 Pots ( BFS , 打印路径 )

题意:

给你两个空瓶子,只有三种操作

一、把一个瓶子灌满

二、把一个瓶子清空

三、把一个瓶子里面的水灌到另一个瓶子里面去(倒满之后要是还存在水那就依然在那个瓶子里面,或者被灌的瓶子有可能没满)

思路:BFS,打印路径时需技巧。

//G++ 840K	0MS
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <stack>
#include <queue>
#include <cmath>
#include <map>
#include <vector>
#include <algorithm>
#define MIN(A,B) ((A)<(B)?(A):(B))
#define DEBUG puts("Hello world!");
#define N 110
using namespace std ;

bool visit[N][N] ;

struct node
{
    int x , y ;
    int step ;
}pos , next ;

struct way
{
    int x , y ;
    int stept ;
}before[N][N] ;

void
Print_Path ( int  x , int  y )
{
    stack<int>st ;
    while ( x != 0 || y != 0 )
    {
        st.push ( before[x][y].stept ) ;
        int temp_x , temp_y ;
        temp_x = before[x][y].x ;
        temp_y = before[x][y].y ;
        x = temp_x ;
        y = temp_y ;
    }
    while ( !st.empty() )
    {
        switch ( st.top() )
        {
        case 1:
            printf("DROP(1)\n");
            break;
        case 2:
            printf("DROP(2)\n");
            break;
        case 3:printf("FILL(1)\n");
            break;
        case 4:printf("FILL(2)\n");
            break;
        case 5:printf("POUR(1,2)\n");
            break;
        case 6:printf("POUR(2,1)\n");
            break;
        }
        st.pop ( ) ;
    }
    return ;
}

void
Modify ( node * const  p , int const x , int const y , int const step )
{
    p->x = x ;
    p->y = y ;
    p->step = step ;
    return ;
}

bool
BFS ( int const A , int const B , int const C )
{
    queue <node>q ;
    next.x = 0 ;
    next.y = 0 ;
    next.step = 0 ;
    visit[0][0] = true ;
    q.push(next) ;
    while ( !q.empty( ) )
    {
        pos = q.front ( ) ;
        q.pop ( ) ;
        if ( C == pos.x || C == pos.y )
        {
            printf ("%d\n" ,pos.step ) ;
            Print_Path ( pos.x , pos.y ) ;
            //DEBUG
            return true ;
        }
        if ( !visit[0][pos.y] && 0 != pos.x )   //case 1 : DROP(1)
        {
            Modify ( & next , 0 , pos.y , pos.step + 1 ) ;
            q.push ( next ) ;
            visit[0][pos.y] = true ;
            before[0][pos.y] = ( struct way ) { pos.x , pos.y,1 } ;
        }
        if ( !visit[pos.x][0] && 0 != pos.y  )      //case 2 : DROP(2)
        {
            Modify ( & next , pos.x , 0 , pos.step + 1 ) ;
            q.push ( next ) ;
            visit[pos.x][0] = true ;
            before[pos.x][0] = ( struct way ) { pos.x , pos.y , 2 } ;
        }
        if ( !visit[A][pos.y] && A != pos.x  )      //case 3 : FILL(1)
        {
            Modify ( & next , A , pos.y , pos.step + 1 ) ;
            q.push ( next ) ;
            visit[A][pos.y] = true ;
            before[A][pos.y] = ( struct way ) { pos.x , pos.y , 3 } ;
        }
        if ( !visit[pos.x][B] && B != pos.y )       //case 4 : FILL(2)
        {
            Modify ( & next , pos.x , B , pos.step + 1 ) ;
            q.push ( next ) ;
            visit[next.x][next.y] = true ;
            before[pos.x][B] = ( struct way ) { pos.x , pos.y , 4 } ;
        }
        if ( pos.x > 0 && pos.y < B )           //case 5 : POUR(1,2)
        {
            int temp ;
            temp = MIN ( pos.x , B - pos.y ) ;
            if ( !visit[pos.x-temp][pos.y+temp] )
            {
                Modify ( & next , pos.x - temp , pos.y + temp , pos.step + 1 ) ;
                q.push ( next ) ;
                visit[next.x][next.y] = true ;
                before[next.x][next.y] = ( struct way ) {pos.x , pos.y,5} ;
            }
        }
        if ( pos.x < A && pos.y > 0 )          //case 6: POUR(2,1)
        {
            int temp ;
            temp = MIN ( pos.y , A - pos.x ) ;
            if ( !visit[pos.x+temp][pos.y-temp] )
            {
                Modify ( & next , pos.x + temp , pos.y - temp , pos.step + 1 ) ;
                q.push ( next ) ;
                visit[next.x][next.y] = true ;
                before[next.x][next.y] = (struct way ){pos.x , pos.y , 6} ;
            }
        }
    }
    return false ;
}

int
main ( )
{
    int A ,B , C ;
    while ( EOF != scanf ("%d%d%d" , & A , & B , & C ) )
    {
        if ( !BFS ( A , B , C ) )
        {
            printf ("impossible\n") ;
        }
        memset ( visit , 0 , sizeof ( visit ) ) ;
    }
    return 0 ;
}


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值