| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 4209 人关注过本帖
标题:求助:10L的瓶子装满水,再给你一个3L,一个7L的瓶子,分出2个5L的水!
只看楼主 加入收藏
xufen340
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
帖 子:166
专家分:1351
注 册:2009-8-7
收藏
得分:0 
初始化随便阿,
定义三变量代表三个瓶体积  
avolume,bvolume,cvolume
定义三变量代表三个瓶里的水
awater,bwater,cwater
如果你取2个瓶子,一个瓶子装满水a,一个不装水c,
所以
cin>>avolume>>cvolume;//选2个瓶子
awater=avolume;//a瓶子装满水。
1.如果avolume==cvolume,直接选取一个bvolume=avolume/2;一步完成。
//上面一段话就是如果2个瓶子一样,选取一个b瓶子体积为a瓶子一半就可以。
2.如果a!=b
就取一个中间瓶,
cin>>bvolume;
这个中间瓶一定要bvolume<=avolume-cvolume,否则重新
cin>>b;这里如果avolume>bvolume,我们按照上面的来,如果
avolume<bvolume,就要调换下,总要满足avolume>bvolume.

三个瓶体积选好了,a瓶子也装满水了(awater=avolume)。

就按照我上面的循环,开始改变了,每次cout<<awater,bwater,cwater;
2009-09-09 09:40
chen_study
Rank: 1
等 级:新手上路
帖 子:10
专家分:0
注 册:2009-8-31
收藏
得分:0 
感谢了,我去写一下代码,有不懂的地方,麻烦你再帮我解决下!
呵呵
2009-09-09 11:59
大爱无言FF
Rank: 1
等 级:新手上路
帖 子:9
专家分:0
注 册:2009-9-4
收藏
得分:0 
不知道大家有没有发现一个规律,那就是:每次分水时要么把原瓶子里的水全部倒光,要么把另一个瓶子装满!我想把这个问题搞清楚应该我助于解决问题吧!
2009-09-09 13:37
chen_study
Rank: 1
等 级:新手上路
帖 子:10
专家分:0
注 册:2009-8-31
收藏
得分:0 
还是写不出来啊,循环控制条件怎么搞都搞不对,,,


好晕哪!
2009-09-09 14:19
chen_study
Rank: 1
等 级:新手上路
帖 子:10
专家分:0
注 册:2009-8-31
收藏
得分:0 
帮我看下这个代码

#include <iostream>
using namespace std;
 
class Bottel
{
public:
    Bottel(int capacity);
     
public:
    void FlowOut(Bottel* odj);
    int FlowIn(int Mete);
    int getMete();
    void Full();
     
private:
    int maxCapa;
    int theMete;
};
 
 
 
Bottel::Bottel(int capacity)
:maxCapa(capacity)
,theMete(0)
{
     
}
 
void Bottel::Full()
{
    theMete = maxCapa;
}
 
int Bottel::getMete()
{
    return theMete;
}
 
void Bottel::FlowOut(Bottel* obj)
{
    theMete = obj->FlowIn(theMete);
}
 
int Bottel::FlowIn(int Mete)
{
    if(theMete + Mete <= maxCapa)
    {
        theMete = theMete + Mete;
        return 0;
    }
    else
    {
        int Return = theMete + Mete - maxCapa;
        theMete = maxCapa;
        return Return;
    }
}
 
 
int main()
{
    Bottel* BArr[3];  
    BArr[0] = new Bottel(7);
    BArr[1] = new Bottel(3);
    BArr[2] = new Bottel(10);
     
    BArr[2]->Full();
     
    int i = 0;
    int tenMete = 0;
    int sevMete = 0;
     
    while(tenMete!=5)
    {
        if(sevMete!=5)
        {
            BArr[2]->FlowOut(BArr[0]);
            sevMete = BArr[0]->getMete();
        }
        else
        {
            BArr[1]->FlowOut(BArr[2]);
            tenMete = BArr[2]->getMete();
        }
         
        i = 0;
         
        while(sevMete!=0 && sevMete!=5)
        {
            BArr[i]->FlowOut(BArr[i+1]);
            tenMete = BArr[2]->getMete();
            sevMete = BArr[0]->getMete();
            
            i=(i+1)%2;
        }
         
         
    }
     
     
    return 0;
}
2009-09-09 14:51
xufen340
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
帖 子:166
专家分:1351
注 册:2009-8-7
收藏
得分:20 

//你先看看这个
#include<iostream>
using namespace std;
void movewater(int const& avolume,int const& bwater,int const& cvolume);
int main()
{
    int avolume,bvolume,cvolume;
    //输入2个a,c瓶子体积
    cin>>avolume>>cvolume;
    if(avolume==cvolume){        
        //留给你了写了         
    }else{
        //a瓶体积小于c瓶,2个标签换过来。
        //要保持a瓶体积大于c瓶.
        if(avolume<cvolume){
            int tmpvolume;
            tmpvolume=avolume;
            avolume=cvolume;
            cvolume=tmpvolume;
        }
        //输入b瓶子体积,第三个数要保证(a-b)/2=整数,否则死循环,交给你了。
        cin>>bvolume;
        movewater(avolume,bvolume,cvolume);
    }
     
}
 
void movewater(int const& avolume,int const& bvolume,int const& cvolume)
{
    int awater,bwater,cwater;
    //a瓶子装满水,b,c等待装水。
    awater=avolume;     
    bwater=0;
    cwater=0;
    //循环倒水
    while(awater!=cwater){
        //如果c瓶为空,则a倒入c         
        if((cwater==0)){
            cwater=cvolume;
            awater=awater-cvolume;
            cout<<awater<<","<<bwater<<","<<cwater<<","<<endl;
        }
 
        //如果b瓶为空,则c倒入b
        else if(bwater==0){
            //b瓶的水和c瓶的水比较后倒入
            if(cwater>=bvolume){
                cwater=cwater-bvolume;
                bwater=bvolume;
            }else{
                bwater=cwater;
                cwater=0;               
            }
            cout<<awater<<","<<bwater<<","<<cwater<<","<<endl;
        }
        //如果b瓶为满,则b倒入a
        else if(bwater==bvolume){
            awater=awater+bwater;
            bwater=0;
            cout<<awater<<","<<bwater<<","<<cwater<<","<<endl;
        }
        //如果b瓶不满也不空,则c倒满b。
        else if(bwater<bvolume){
            cwater=cwater-(bvolume-bwater);
            bwater=bvolume;
            cout<<awater<<","<<bwater<<","<<cwater<<","<<endl;
        }
 
    }
}
 
2009-09-09 16:40
xufen340
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
帖 子:166
专家分:1351
注 册:2009-8-7
收藏
得分:0 
输入b瓶子体积,第三个数要保证(a-b)/2=整数,否则死循环这个是我分析错误,选取b瓶子体积也是要考虑的。太忙,晚上想想。
2009-09-09 16:56
chen_study
Rank: 1
等 级:新手上路
帖 子:10
专家分:0
注 册:2009-8-31
收藏
得分:0 
这个我看明白了!!

不过输入瓶子的顺序必须是 10 7 3  
输入10 3 7或其他顺序就不可以

这个有办法解决吗??

不过这个程序经你这么一些一说明..........牛

是在是太感谢,,,,,


2009-09-09 18:07
xufen340
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
帖 子:166
专家分:1351
注 册:2009-8-7
收藏
得分:0 
//改好了,现在随便你玩了,都可以平衡,死循环也会告诉你,这个程序就这样结束吧。

#include<iostream>  
using namespace std;  
void movewater(int const& avolume,int const& bwater,int const& cvolume);  
void move(int const& fromvolume ,int const& tovolume,int & fromwater,int & towater);
int main()  
{  
    int avolume,bvolume,cvolume;  
    //输入2个a,c瓶子体积  
    cin>>avolume>>bvolume>>cvolume;  
    movewater(avolume,bvolume,cvolume);     
}  
 
void movewater(int const& avolume,int const& bvolume,int const& cvolume)  
{  
    int awater,bwater,cwater;
    int i=1;
    //a瓶子装满水,b,c等待装水。  
    awater=avolume;      
    bwater=0;  
    cwater=0;  
    //循环倒水  
    while(awater!=cwater){  
        //如果c瓶为空,则a倒入c         
        if((cwater==0)){
        move(avolume,cvolume,awater,cwater);
        cout<<avolume<<"("<<awater<<")"<<",";
        cout<<bvolume<<"("<<bwater<<")"<<",";
        cout<<cvolume<<"("<<cwater<<")"<<endl;
        }
 
 
        //如果b瓶为空,则c倒入b  
        else if(bwater==0){  
           move(cvolume,bvolume,cwater,bwater);
           cout<<avolume<<"("<<awater<<")"<<",";
           cout<<bvolume<<"("<<bwater<<")"<<",";
           cout<<cvolume<<"("<<cwater<<")"<<endl;
        }  
        //如果b瓶为满,则b倒入a  
        else if(bwater==bvolume){  
            move(bvolume,avolume,bwater,awater);
            cout<<avolume<<"("<<awater<<")"<<",";
            cout<<bvolume<<"("<<bwater<<")"<<",";
            cout<<cvolume<<"("<<cwater<<")"<<endl;
        }  
        //如果b瓶不满也不空,则c倒满b。  
        else if(bwater<bvolume){  
            move(cvolume,bvolume,cwater,bwater);
            cout<<avolume<<"("<<awater<<")"<<",";
            cout<<bvolume<<"("<<bwater<<")"<<",";
            cout<<cvolume<<"("<<cwater<<")"<<endl;
        }  
        //如果和第一次重复了,那就不能达到平衡。
        int astate,bstate,cstate;
        if(i==1){
            astate=awater;
            bstate=bwater;
            cstate=cwater;
        }else{
            if((astate==awater)&&(bstate==bwater)&&(cstate==cwater)){
                cout<<"program go into dead"<<endl;
                break;
            }
        }
        i++;
 
    }  
}  
 
 
//倒入
void move(int const& fromvolume ,int const& tovolume,int & fromwater,int & towater)
{
    /*
    *第一个瓶子向第二个瓶子最大限度倒入
    */
 
    if(fromwater>=(tovolume-towater)){
        fromwater=fromwater-(tovolume-towater);
        towater=tovolume;
    }else{
        towater=towater+fromwater;
        fromwater=0;
    }
}
2009-09-09 20:44
RongDQ
Rank: 1
等 级:新手上路
帖 子:4
专家分:3
注 册:2009-8-24
收藏
得分:0 
用递归不用循环
看这样分析怎样?
3个瓶子的水量用数组表示。
每一次倒水用一种变换来表示,变换的结果,是数组的改变。
比如第一次
//////////////////////
10L   3L    7L
/////////////////////
10    0     0
对这个状态,可以进行6种操作:10倒进3,10倒进7,3倒进10,3倒进7,7倒进10,7倒进3
但因每次到过之后必定有一个满杯子或空杯子,所以相应的理论上只有4种操作。对应4种计算。

那么10   0    0下面就有4个节点(理论上),而且每个节点又有4个分节点。
这个树到第10层,就有4^10个节点。这个数不太大。用递归时间上应该没问题。

关于数据的选择,不知道用16进制的百位数表示是否更快?百位表第一个杯子,十位表第二个,个位表示第三个。

如果有一天,一个机器人看到这个问题,编了个程序解决了,会是什么结果呢?
也许机器人离选举权就不远了。
2009-09-11 16:04
快速回复:求助:10L的瓶子装满水,再给你一个3L,一个7L的瓶子,分出2个5L的水!
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.018615 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved