题目我就不粘贴了,点这里
大致意思是:输入三个数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;
}