九度OJ Jugs (装水凑容量问题)

66 篇文章 1 订阅
27 篇文章 0 订阅

题目我就不粘贴了,点这里

大致意思是:输入三个数a,b,c,表示有两个容器的容量分别是a和b,然后经过有限个六个步骤(将a加满,将b加满,将水从a倒入b,将水从b倒入a,清空容器a,b)里面的几步,从而使得容器里的水容量为c,因为这道题是特殊判题,也就是说不用考虑不成功的情况。

这里我分为两种情况,第一,容器a的容量小于N,这种情况相当于样例一,不断的给容器b加水,然后倒入容器a,等a清空之后,再将多余的水倒入容器a,然后反复执行,直到出现容量为N的水,将其倒入容器b.

第二,容器a的容量大于N,这种情况相当于样例二,不断的给容器a加水,然后倒入容器b,等容器b加满之后,注意多出的水的容量是否为N,不是的话,再重复以上过程。

在模拟的时候可以这样抽象化,将两个容器内的水量看作两个状态,样例二就可以这样表示:(0,0)、(5,0)、(0,5)、(5,5)、(3,7)、(3,0)、(0,3)、success


#include <iostream>
using namespace std;

int main(){
    int Ca,Cb,N;
    while(cin>>Ca>>Cb>>N){
        int stateA=0,stateB=0;  //表示A,B罐头内水容量的状态
        if(Ca < N){  //condition 1
            while(stateB!=N){
                cout<<"fill B"<<endl;
                stateB = Cb;
                if(stateB == N)
                    break;
                cout<<"pour B A"<<endl;
                stateB = Cb - (Ca - stateA);
                stateA = Ca;
                if(stateB == N)
                    break;
                do{
                    cout<<"empty A"<<endl;
                    cout<<"pour B A"<<endl;
                    stateB = stateB - Ca;
                }while(stateB>0);
                stateA = Ca + stateB;
                stateB = 0;
            }
        }
        else{     //condition 2
            while(stateB!=N){
                do{
                    cout<<"fill A"<<endl;
                    cout<<"pour A B"<<endl;
                    stateB += Ca;
                }while(stateB <= Cb);
                stateA = stateB - Cb;
                cout<<"empty B"<<endl;
                stateB = 0;
                cout<<"pour A B"<<endl;
                stateB = stateA;
            }
        }
        cout<<"success"<<endl;
    }
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值