九度OJ;题目1147:Jugs

原题链接地址:http://ac.jobdu.com/problem.php?pid=1147

转载请注明本文链接:http://blog.csdn.net/yangnanhai93/article/details/42016353


BFS很简单的思想,但是注意剪枝,因为很多会重复,比如,不断的empty,这个重复很严重,所以很有必要去除重复,即记录1000 *1000的矩阵,保证对想通的a,b不重复计算

#include <stdio.h>
#include <queue>
#include <string>
#include <memory.h>
using namespace std;
 
string op[6]={"fill A","fill B","pour B A","pour A B","empty A","empty B"};
bool visited[1001][1001];
struct Node
{
    int left,right;
    vector<int> op;
};
void Cal(int a,int b,int q)
{
    queue<Node> result;
    Node first,second;
    first.left=0;
    first.right=0;
    result.push(first);
    memset(visited,0,sizeof(visited));
    while(!result.empty())
    {
        first=result.front();
        result.pop();
        for(int i=0;i<6;i++)
        {
            second=first;
            switch (i)
            {
            case 0:
                second.left=a;
                break;
            case 1:
                second.right=b;
                break;
            case 2://pour b to a
                if(second.right<=a-second.left)
                {
                    second.left=second.left+second.right;
                    second.right=0;
                }
                else
                {
                    second.right=second.right-(a-second.left);
                    second.left=a;                  
                }
                break;
            case 3:
                if(second.left<=b-second.right)
                {
                    second.right=second.right+second.left;
                    second.left=0;
                }
                else
                {
                    second.left=second.left-(b-second.right);
                    second.right=b;
                }
                break;
            case 4:
                second.left=0;
                break;
            case 5:
                second.right=0;
                break;
            }
            second.op.push_back(i);
            if(second.right==q)
            {
                for(int i=0;i<second.op.size();i++)
                    printf("%s\n",op[second.op[i]].c_str());
                printf("success\n");
                return;
            }
            else
            {
                if(!visited[second.left][second.right])
                    result.push(second);
                visited[second.left][second.right]=true;
            }
        }
    }
}
int main()
{
    int a,b,q;
    while(scanf("%d%d%d",&a,&b,&q)!=EOF)
    {
        Cal(a,b,q);
    }
    return 0;
}
/**************************************************************
    Problem: 1147
    User: vincent_ynh
    Language: C++
    Result: Accepted
    Time:10 ms
    Memory:2036 kb
****************************************************************/


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值