希望能找到一位不在乎工作经验和年龄而在乎工作能否迅速适应的伯乐。
E_mail:   [email protected]     Tel:    010-87437777以下是我用Java写的一个算法:////////////////////////////////////////////////////////////////////////////////////////////////
//  题目:有3个盛油的容器,容量分别可以装10、7、3两,都没有刻度。现在有1斤油装在10两的容器中  //
//        ,要求仅用现有的容器把这1斤油平均分成两个5两,装在10两和 7两这两个容器中,不限制倒  //
//   的次数。                                                                            //
//  来由:在以前学习C语言的时候,接触到了来自西方的 <汉诺塔>问题,其中运用了比较经典的数学递  //
//        归算法。蓦然想起了小的时候父亲曾经给我出的<韩信走马分油>问题,这个问题的经典性我想  //
//        是不亚于 <汉诺塔>问题的,那为什么这么好的国粹没有被编入C语言的教科书?在强烈的民族  //
//        自尊心的驱使下,设计了该问题的算法。                                                //        
//  作者:高继福                       时间:2000年用C++来实现      2005/05/07下午用Java来写  //
//////////////////////////////////////////////////////////////////////////////////////////////////描述倒油类
class OilPour
{
final private int BOTTLE_CAPACITY;   //容器的容量属性
private int bottle_amount;           //初始状态时容器中的盛油量
static int step = 0;                 //统计倒油的步数
final static int MAX_STEP = 20;      //最多可倒的次数 //构造方法(用以上两个属性做参数)
public OilPour(int BOTTLE_CAPACITY, int bottle_amount)
{
this.BOTTLE_CAPACITY = BOTTLE_CAPACITY;
this.bottle_amount = bottle_amount;
} //取得容器的容量属性
public int getBottle_capacity()
{
return this.BOTTLE_CAPACITY;
} //重新设置容器中的盛油量
public void setBottle_amount(int bottle_amount)
{
this.bottle_amount = bottle_amount;
} //取得容器中的盛油量
public int getBottle_amount()
{
return this.bottle_amount;
} //输出显示容器中的盛油量
public void displayBottle_amount(OilPour[] op)
{
System.out.print("此时3个容器中的油量为:\t\t");

for(int i=0;i<op.length;i++)
{
System.out.print(op[i].getBottle_amount() + "\t\t");
}
} //倒油的方法,传进两个倒油类对象和一个用于倒油输出提示的字符串作参数
public void pourOil(OilPour a, OilPour b, String temp)
{
//记录此次倒油的数量
int poured_amoount = 0; //如果容器b中还没有盛满油,就开始给b倒, 直到:或者容器a为空,或者容器b满为止   
while((b.getBottle_amount() < b.getBottle_capacity()) && (a.getBottle_amount() > 0))
{
a.setBottle_amount(a.getBottle_amount()-1);   //倒出1两
b.setBottle_amount(b.getBottle_amount()+1);   //倒进1两 poured_amoount++;   //累计倒油的数量
} this.step++;   //累计倒油的步数 //输出显示
System.out.print("\n\n第"+this.step+"步:"+temp+"倒了"+poured_amoount+"两油,");  
} //倒油的方法,传进一个倒油类的对象数组作参数,其中有3个元素
public boolean pourOil(OilPour[] op)
{
int i = 0;    //定义一个循环变量 //在没有最后分好的时候一直循环,直到分好为止,
//    对总共倒的次数做了限制,防止无限循环下去
while(!((op[0].getBottle_amount() == op[0].getBottle_capacity() / 2) && 
(op[1].getBottle_amount() == op[0].getBottle_capacity() / 2)) && 
(this.step < this.MAX_STEP))
{
String temp = "";  //定义一个临时用于倒油输出提示的字符串变量

//如果该容器和下一个容器中的任何一个都没有分好
if((op[i].getBottle_amount() != op[0].getBottle_capacity() / 2) && 
(op[(i+1)%3].getBottle_amount() != op[0].getBottle_capacity() / 2))
{
//如果该容器已经盛满
if(op[i].getBottle_amount() == op[i].getBottle_capacity())
{
temp = "第" + (i+1) + "个容器向第" + ((i+1)%3+1) + "个容器"; this.pourOil(op[i],op[(i+1)%3],temp);    //开始倒给下一个容器
this.displayBottle_amount(op);     //输出显示
}
//如果下一个容器为空
else if(op[(i+1)%3].getBottle_amount() == 0)
{
temp = "第" + (i+1) + "个容器向第" + ((i+1)%3+1) + "个容器"; this.pourOil(op[i],op[(i+1)%3],temp);    //开始倒给下一个容器
this.displayBottle_amount(op);     //输出显示
}
}
//如果是最大的那个容器已经分好
else if((op[i].getBottle_amount() == op[0].getBottle_capacity() / 2) && (i == 0))
{
temp = "第" + (i+3) + "个容器向第" + (i+1) + "个容器"; this.pourOil(op[2],op[1],temp);              //第三个容器倒给第二个容器
this.displayBottle_amount(op);         //输出显示
}
//如果是中间的那个容器已经分好
else if((op[i].getBottle_amount() == op[0].getBottle_capacity() / 2) && (i == 1))
{
temp = "第" + (i+3) + "个容器向第" + i + "个容器"; this.pourOil(op[2],op[0],temp);              //第三个容器倒给第一个容器
this.displayBottle_amount(op);         //输出显示
} i = (++i) % 3;    //循环变量递增加1
} //如果最后分成功了,返回true
if((op[0].getBottle_amount() == op[0].getBottle_capacity() / 2) &&
(op[1].getBottle_amount() == op[0].getBottle_capacity() / 2))
{
return true;
} return false;   //否则返回false
}
}//主类,测试倒油类
public class Test_OilPour
{
public static void main(String[] args)
{
//创建一个倒油类对象的数组
OilPour[] op = new OilPour[3]; //创建3个倒油类的对象,给op中的元素赋值
op[0] = new OilPour(10, 10);
op[1] = new OilPour( 7,  0);
op[2] = new OilPour( 3,  0); //显示初始状态
System.out.print("\n在倒之前的初试状态:  \t\t\t\t3个容器中的油量分别为:\t\t   ");
System.out.print(op[0].getBottle_amount()+"\t\t");
System.out.print(op[1].getBottle_amount()+"\t\t");
System.out.print(op[2].getBottle_amount()+"\t\t"); //开始倒油以及显示最后的结果
if(op[0].pourOil(op))
System.out.println("\n\n分油成功!");
else
System.out.println("\n\n分油失败!");
}
}/*输出结果如下:
在倒之前的初试状态:                  3个容器中的油量分别为:       10        0        0第1步:第1个容器向第2个容器倒了7两油,此时3个容器中的油量为:        3        7        0第2步:第2个容器向第3个容器倒了3两油,此时3个容器中的油量为:        3        4        3第3步:第3个容器向第1个容器倒了3两油,此时3个容器中的油量为:        6        4        0第4步:第2个容器向第3个容器倒了3两油,此时3个容器中的油量为:        6        1        3第5步:第3个容器向第1个容器倒了3两油,此时3个容器中的油量为:        9        1        0第6步:第2个容器向第3个容器倒了1两油,此时3个容器中的油量为:        9        0        1第7步:第1个容器向第2个容器倒了7两油,此时3个容器中的油量为:        2        7        1第8步:第2个容器向第3个容器倒了2两油,此时3个容器中的油量为:        2        5        3第9步:第3个容器向第1个容器倒了3两油,此时3个容器中的油量为:        5        5        0分油成功!*/