没具体做过,但我的想法是,首先先弄明白如何得到6升水。
1.将5升瓶子(A)装满水,倒进7升的瓶子(B) (现在B差2L水就满了)
2.重复1,只能倒进去2L,B就满了。B中的水倒掉,再把A中剩余的水倒进B(现在B差4L满)。
3.重复1,只能倒进去4L,B就满了。B中的水倒掉,再把A中剩余的水倒进B(现在B差6L满)。
4.重复1,现在能把全部的水(5L)倒进B中。加上3步骤B里的1L水,现在B里面就有6L水了。
那么,就可以利用栈(Stack)来进行操作。
A栈,长度为5;B栈,长度为7。
A、B栈中数据元素的类型皆为布尔类型。
初始化的时候,A中元素全为true,B中为false。
首先设定一个死循环。
然后在这个死循环中循环A栈,如果A中元素为true,则将B中对应位置的元素赋为true;
循环的时候,如果到A的末尾了,那么再从头开始循环A; 如果到B的末尾了,那么同样,也要从头开始对B赋值。
而当第二次循环到A中第二个元素的时候,B中对应的为最后一个元素(7),那么在循环到第三个元素之前,要将B中所有的元素设为false。下面同理,就是每当B栈满的时候,要将其设为空(就是所有元素设为false)。
然后,每次循环完A之后,检查一下B,如果B中有六个元素为true,而有一个为false,那么就得到了6L水。 然后break,跳出死循环,就OK了。
首先我需要另外若干个瓶子。
7-5=2(将7升的瓶子倒入5升中可以得到的剩余值)
5*2-7=3(将5升的瓶子装满两次倒入7升中可以得到的剩余值)
这是我们可以得到的两个基本单位
那么2或者3如何变成6
重复2的动作3次,或者重复3的动作2次。
这种题还是当数学题好玩,你自己看二楼改吧,我只说下数学怎么做他们太细,A5,B7,第一步先把B装满,倒入A中,在把A中倒了,把B剩下的倒入A中,在把B装满在倒入A中,最后在把B装满倒入A中B中就剩下6L了.多简单.
//瓶子
class Bottle{
private double volume; //容量
private double water = 0; //装水量
public double getVolume(){
return this.volume;
}
public double getWater(){
return this.water;
}
//构造函数
Bottle(double volume){
this.volume = volume;
}
//获取当前剩余容量
public double getHaveVolume(){
return this.volume - this.water;
}
//装满水
public void addFullWater(){
this.water = this.volume;
}
//倒掉所有水
public void pourAllWater(){
this.water = 0;
}
//倒水
public void pourWater(double water){
//
if(water < this.water){
this.water -= water;
}else{
this.water = 0;
}
}
//其他(bottle)瓶子向该(this)瓶子装水
public void addWater(Bottle bottle){
//判断其他瓶子中的水量是否大于该瓶子剩余的容量
if(bottle.getWater() > this.getHaveVolume()){
//倒出水
bottle.pourWater(this.getHaveVolume());
//装入水
this.water += this.getHaveVolume();
}else{
double runingWater = bottle.getWater();
//倒出水
bottle.pourWater(runingWater);
//装入水
this.water += runingWater;
}
}
}
public class test{
public static void main(String[] args){
Bottle b5 = new Bottle(5.0);
Bottle b7 = new Bottle(7.0);
while(true){
b7.addFullWater();
System.out.println("给7升瓶子加满水;");
System.out.println();
b5.addWater(b7);
System.out.println("把7升瓶子中的水倒入5升瓶子;7升瓶子中有"+b7.getWater()+"升水,5升瓶子中有"+b5.getWater()+"升水;");
System.out.println();
if(b7.getWater() == 6.0)break;
b5.pourAllWater();
System.out.println("倒掉5升瓶子中的水;");
System.out.println();
b5.addWater(b7);
System.out.println("把7升瓶子中的水倒入5升瓶子;7升瓶子中有"+b7.getWater()+"升水,5升瓶子中有"+b5.getWater()+"升水;");
System.out.println();
if(b7.getWater() == 6.0)break;
}
}
}
昏,不打了。。答案见上。。