三桶水 算法

风轻云也净 2010-08-06 10:17:55
3个捅,体积分别是30升、17升、13升、30升的捅装满水,用最少的次数,将水平分成2个15升,编一个程序实现!什么事最简单的算法,我刚开学学,请高手指教。先谢谢了。

...全文
368 26 打赏 收藏 转发到动态 举报
写回复
用AI写文章
26 条回复
切换为时间正序
请发表友善的回复…
发表回复
liuwei_blog 2010-08-13
  • 打赏
  • 举报
回复


public class SanTongShui {

private Tong daTong;
private Tong zhongTong;
private Tong xiaoTong;
private int count; // 倒水次数

public SanTongShui() {
daTong = new Tong("大", 30, 30);
zhongTong = new Tong("中", 17, 0);
xiaoTong = new Tong("小", 13, 0);

statusHead();
}

public void oper() {

if (isStop()) {
System.out.println("倒水" + count + "次,结束");
return;
}

if (xiaoTong.isFull()) {
daoshui(xiaoTong, daTong);
} else if (zhongTong.isEmpty()) {
daoshui(daTong, zhongTong);
} else {
daoshui(zhongTong, xiaoTong);
}
showStatus();
oper();
}

private void statusHead() {
System.out.println("\t" + daTong.getName() + "\t" + zhongTong.getName()
+ "\t" + xiaoTong.getName());
}

private void showStatus() {
System.out.println(daTong.getH() + "\t" + zhongTong.getH() + "\t"
+ xiaoTong.getH());
}

public boolean isStop() {
if (daTong.getH() == zhongTong.getH() && zhongTong.getH() == 15)
return true;
return false;
}

/**
* t1 - > t2,t1 水倒入 t2 中,倒入后有两种情况,t2 水满或 t1 水空。
*
* @param t1
* @param t2
*/
public void daoshui(Tong t1, Tong t2) {
int n; // t1 倒出的水量
if (t1.getH() >= t2.freeSize())
n = t2.freeSize();
else
n = t1.getH();

t1.setH(t1.getH() - n);
t2.setH(t2.getH() + n);
count++;
System.out.print(t1.getName() + "->" + t2.getName() + "\t");
}

class Tong {
int max; // 容积
int h; // 当前水量
String name;

public Tong(String name, int cubage, int h) {
if (h > cubage)
throw new RuntimeException("当前水量不能大于水桶容积");
this.name = name;
this.max = cubage;
this.h = h;
}

/**
* 可用体积
*
* @return
*/
public int freeSize() {
return max - h;
}

public boolean isFull() {
return max == h;
}

public boolean isEmpty() {
return h == 0;
}


public String getName() {
return name;
}

public int getH() {
return h;
}

public void setH(int h) {
this.h = h;
}

}

/**
* @param args
*/
public static void main(String[] args) {
new SanTongShui().oper();

}
}/*output
大 中 小
大->中 13 17 0
中->小 13 4 13
小->大 26 4 0
中->小 26 0 4
大->中 9 17 4
中->小 9 8 13
小->大 22 8 0
中->小 22 0 8
大->中 5 17 8
中->小 5 12 13
小->大 18 12 0
中->小 18 0 12
大->中 1 17 12
中->小 1 16 13
小->大 14 16 0
中->小 14 3 13
小->大 27 3 0
中->小 27 0 3
大->中 10 17 3
中->小 10 7 13
小->大 23 7 0
中->小 23 0 7
大->中 6 17 7
中->小 6 11 13
小->大 19 11 0
中->小 19 0 11
大->中 2 17 11
中->小 2 15 13
小->大 15 15 0
倒水29次,结束
*/

加贝哥|usun 2010-08-09
  • 打赏
  • 举报
回复
算法是一个需要研究的问题
a451274642 2010-08-09
  • 打赏
  • 举报
回复
class A//三桶水问题 30 17 13 得到两个15
{
public static void main(String[]arg)//这里的参数和下面介绍的一致
{
int m=2,n=0,i=1;//n是上面说的n=(4*i)%17B桶在一次循环结束后的值
while(15!=((4*i)%17))
{
n+=4;
m+=4;
if(n>13)//当在一次循环结束时n>0时 省略A->B,B->C两步,进入下一次循环
{
n=n-13;
m=m+2;
i++;//一定要加
}

i++;
}
System.out.print(m+3);
}

}
ring_war3_913 2010-08-06
  • 打赏
  • 举报
回复
30倒入17,17倒入13,13倒入30,17倒入13,30倒入17,17倒入13,13倒入30,17倒入13,30倒入17,17倒入13,13倒入30,17倒入13,30倒入17,17倒入13,13倒入30,17倒入13,13倒入30,17倒入13,30倒入17,17倒入13,13倒入30,17倒入13,30倒入17,17倒入13,13倒入30,17倒入13,30倒入17,13倒入30 就可以了有了两个15的了。
qq329480985 2010-08-06
  • 打赏
  • 举报
回复
//定义一个桶子类
class Barrel{
private Integer capacity; //容量
private Integer current;//当前水量

public void setCapacity(Integer capacity){
this.capacity=capacity;
}

public Integer getCapacity(){
return this.capacity;
}

public void setCurrent(Integer current){
this.current=current;
}

public Integer getCurrent(){
return this.current;
}

}

public class TestString {


//把水从barrel1倒入barrel2
public static void EnterWater(Barrel barrel1,Barrel barrel2){
if(barrel1.getCurrent()!=0&&barrel2.getCurrent()<barrel2.getCapacity()){//如果barrel1有水并且barrel2没有装满
Integer temp=0;
Integer current1=barrel1.getCurrent();
Integer current2=barrel2.getCurrent();
if(current1>(barrel2.getCapacity()-current2)){//如果barrel1里面的水可以把barrel2装满
temp=barrel2.getCapacity()-current2;
barrel1.setCurrent(current1-temp);
barrel2.setCurrent(barrel2.getCapacity());
}
else{//否则
barrel2.setCurrent(current1+current2);
barrel1.setCurrent(0);
}
}
}

public static void main(String[] args) {
Barrel A=new Barrel();
Barrel B=new Barrel();
Barrel C=new Barrel();
A.setCapacity(30);
B.setCapacity(17);
C.setCapacity(13);
//开始进行
Integer time=0;//计算次数的
A.setCurrent(30);
B.setCurrent(0);
C.setCurrent(0);
/*A.getCurrent()!=15&&B.getCurrent()!=15*/
while(true){
EnterWater(A,B);time++;
System.out.println(A.getCurrent()+" "+B.getCurrent()+" "+C.getCurrent());
EnterWater(B,C);time++;
System.out.println(A.getCurrent()+" "+B.getCurrent()+" "+C.getCurrent());
EnterWater(C,A);time++;
System.out.println(A.getCurrent()+" "+B.getCurrent()+" "+C.getCurrent());
if(A.getCurrent()==15&&B.getCurrent()==15){
break;
}
EnterWater(B,C);time++;
System.out.println(A.getCurrent()+" "+B.getCurrent()+" "+C.getCurrent());
if(C.getCurrent()==C.getCapacity()){//此时如果C满了
EnterWater(C,A);time++;
System.out.println(A.getCurrent()+" "+B.getCurrent()+" "+C.getCurrent());
EnterWater(B,C);time++;
System.out.println(A.getCurrent()+" "+B.getCurrent()+" "+C.getCurrent());
}
}
System.out.println("一共进行了"+time+"操作");
}
}


主要思想就是A->B B->C C->A B->C ,其中有些情况要特殊处理的,请各位指教。
Qin_Tianxiang 2010-08-06
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 closewbq 的回复:]
三桶水!!!!

30的导入13的,13的导入17的,30的在倒入13的,13的将17的倒满。然后将剩下的倒回30的?
[/Quote]
就算是这样倒
倒来倒去不还是
30升的桶里水13升,17升的桶17升水
风轻云也净 2010-08-06
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 closewbq 的回复:]
三桶水!!!!

30的导入13的,13的导入17的,30的在倒入13的,13的将17的倒满。然后将剩下的倒回30的?
[/Quote]

拜托,大哥,你能不能好好读下题目啊,要是这么倒我还发帖干什么,汗~~~~~,你NB
closewbq 2010-08-06
  • 打赏
  • 举报
回复
三桶水!!!!

30的导入13的,13的导入17的,30的在倒入13的,13的将17的倒满。然后将剩下的倒回30的?
风轻云也净 2010-08-06
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 qq329480985 的回复:]
算法不难..写给你
[/Quote]

真的啊,谢谢,(*^__^*) 嘻嘻……
qq329480985 2010-08-06
  • 打赏
  • 举报
回复
算法不难..写给你
染指黄昏 2010-08-06
  • 打赏
  • 举报
回复
刚学 帮顶
风轻云也净 2010-08-06
  • 打赏
  • 举报
回复
没有人会做吗?汗
Qin_Tianxiang 2010-08-06
  • 打赏
  • 举报
回复
帮顶一个...
jnhcd 2010-08-06
  • 打赏
  • 举报
回复
每天回帖即可获得10分可用分
风轻云也净 2010-08-06
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 kala197 的回复:]
编程的终极 算法................. 帮你顶个
工作没写过算法 都是用别人的 哎 悲哀哇 到现在 还不会
[/Quote]

愁死我了咧,谢谢,我再想想
kala197 2010-08-06
  • 打赏
  • 举报
回复
编程的终极 算法................. 帮你顶个
工作没写过算法 都是用别人的 哎 悲哀哇 到现在 还不会
风轻云也净 2010-08-06
  • 打赏
  • 举报
回复
谢谢了
coooliang 2010-08-06
  • 打赏
  • 举报
回复
a451274642 2010-08-06
  • 打赏
  • 举报
回复
先给你写算法吧:
1.先把30升的倒掉 剩下13和17
2.有三个杯子,现将30设为A,17设为B,13设为C。倒掉B,C的水
3.因为17-13能的到4,所以把A->B,B->C,C-A,B-C当做是一个循环,然后可以发现C->A这一步的
结果是:n=(4*i)%17。(n是执行完C->A这一步时C的值,i是循环执行的次数)
并且可以确定当最后一次循环应该是A->B,B->C,C->A(因为贮存15升的只能是A,B)但是当遇到一个循环结束时n>0,则下一步我们可以省掉A->B,B->C两步
4.总共执行次数m的代码应该是:
class A
{
public static void main(String[]arg)//这里的参数和下面介绍的一致
{
int m=2,n=0,i=1;//n是上面说的n=(4*i)%17B桶在一次循环结束后的值
while(15!=((4*i)%17))
{
n+=4;
m+=4;
if(n>13)//当在一次循环结束时n>0时 省略A->B,B->C两步,进入下一次循环
{
n=n-13;
m=m+2;
i++;//一定要加
}

i++;
}
System.out.print(m+3);
}

}
输出时31 前面的几个是29次 但是我觉得应该加上开始把B,C桶水倒掉的两次

这题不是考过程 而是考算法 它只要求次数而已 所以就这么简单!~要求过程的话 那你看看前面几个人的吧
加载更多回复(4)

51,411

社区成员

发帖
与我相关
我的任务
社区描述
Java相关技术讨论
javaspring bootspring cloud 技术论坛(原bbs)
社区管理员
  • Java相关社区
  • 小虚竹
  • 谙忆
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧