| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2827 人关注过本帖, 1 人收藏
标题:倒水问题求编程,你给力我给分!
只看楼主 加入收藏
取消关键字高亮
有容就大
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:东土大唐
等 级:版主
威 望:74
帖 子:9048
专家分:14309
注 册:2011-11-11
结帖率:99.34%
收藏(1)
已结贴  问题点数:50 回复次数:43 
倒水问题求编程,你给力我给分!
一个12升的容器装满了水,希望把他分成相等的两份,但手边只有一个8升的容器和一个5升的容器,问咱怎么倒才能达到目的,试编程写出所有的倒水方案,并找到倒水次数最少的一种方案。

方案1.   12升    8升    5升
         12      0      0
         4       8      0
         4       3      5
         9       3      0
         9       0      3
         1       8      3
         1       6      5
         6       6      0
还有其他方案。
搜索更多相关主题的帖子: 其他 编程 
2012-01-16 20:43
a271885843
Rank: 2
等 级:论坛游民
帖 子:291
专家分:58
注 册:2011-11-24
收藏
得分:2 
你不厚道,在我的帖子后面跟个这么难得的题,严重伤害了我的自信心和求知欲,搞的我现在很郁闷

认为事物非黑即白是缺智慧的表现……
2012-01-16 22:04
weipeng1217
Rank: 5Rank: 5
等 级:职业侠客
帖 子:175
专家分:386
注 册:2012-1-12
收藏
得分:0 
给力进行中...

C坛友交流群 群号:161091913 ,欢迎经常在线的朋友加入,一起学习,一起进步。。
2012-01-16 23:03
vandychan
Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15
等 级:贵宾
威 望:18
帖 子:2296
专家分:6418
注 册:2010-8-20
收藏
得分:16 
int M=7;//A容量
int N=4;//B容量
int K=1;//要求量

int watera=0;
int emptya=M;
int flaga=0;//0空 1满 -1有水

int waterb=0;
int emptyb=N;
int flagb=0;//0空 1满 -1有水

int i=0;
char op[500];

void oprec(int oflag)//操作记录-------------------
{
    switch(oflag)
    {
    case 0:op[i]='0';i++;break;
    case 1:op[i]='1';i++;break;
    case 2:op[i]='2';i++;break;
    case 3:op[i]='3';i++;break;
    case 4:op[i]='4';i++;break;
    case 5:op[i]='5';i++;break;
    }
}

void aputin()//0  A装满水----------------------
{
    if (flaga==0&&flagb!=1)
    {
        watera=M;
        emptya=0;
        flaga=1;
        oprec(0);
        return;
    }
    else return;
}

void aputoff()//1 A水清空----------------------
{
    if (flaga==1&&flagb!=0)
    {
        watera=0;
        emptya=M;
        flaga=0;
        oprec(1);
        return;
    }
    else return;
}

void atob()//2 A水倒进B-----------------------
{
    if(flaga==0||flagb==1||watera==emptyb)
        return;
    else if(watera<emptyb)
    {
        waterb=waterb+watera;
        watera=0;
        emptya=M;
        flaga=0;
        emptyb=N-waterb;
        flagb=-1;
        oprec(2);
        return;
    }
    else if(watera==emptyb)
    {
        watera=0;
        emptya=M;
        flaga=0;
        waterb=N;
        emptyb=0;
        flagb=1;
        oprec(2);
        return;
    }
    else {
        watera=watera-emptyb;
        waterb=N;
        emptyb=0;
        flagb=1;
        emptya=M-watera;
        flaga=-1;
        oprec(2);
        return;
    }
}

void bputin()//3  B装满水---------------------
{
    if (flagb==0&&flaga!=1)
    {
        waterb=N;
        emptyb=0;
        flagb=1;
        oprec(3);
        return;
    }
    else return;
}

void bputoff()//4 B水清空-----------------------
{
    if (flagb==1&&flaga!=0)
    {
        waterb=0;
        emptyb=N;
        flagb=0;
        oprec(4);
        return;
    }
    else return;
}

void btoa()//5 B水倒进A-----------------------
{
    if(flagb==0||flaga==1||waterb==emptya)
        return;
    else if(waterb<emptya)
    {
        watera=watera+waterb;
        waterb=0;
        emptyb=N;
        flagb=0;
        emptya=M-watera;
        flaga=-1;
        oprec(5);
        return;
    }
    else if(waterb==emptya)
    {
        waterb=0;
        emptyb=N;
        flagb=0;
        watera=M;
        emptya=0;
        flaga=1;
        oprec(5);
        return;
    }
    else {
        waterb=waterb-emptya;
        watera=M;
        emptya=0;
        flaga=1;
        emptyb=N-waterb;
        flagb=-1;
        oprec(5);
        return;
    }
}

int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
{
................
        if (!AfxWinInit(::GetModuleHandle(NULL), NULL, ::GetCommandLine(), 0))
    {
        ...............    }
    else
    {
        ..............
    int ofg;
    srand(time(0));
    do{
        ofg=rand()%6;
        switch(ofg)
        {
        case 0:aputin();break;
        case 1:aputoff();break;
        case 2:atob();break;
        case 3:bputin();break;
        case 4:bputoff();break;
        case 5:btoa();break;
        }
        if (watera==K||waterb==K)
        {
            printf("成功步骤:");
            for (int l=0;l<500;l++)
            printf("%c",op[l]);
            return nRetCode;
        }
    } while(i<500);
printf("无解");
    }
    return nRetCode;
}
基本思路是:
将A B两桶行为分别分解成3种:装满水 倒光水 倒进另一个桶  两个桶就是6个行为
程序模拟人的思路
随机作出有效行动
知道在500步内解答
500以外的认为是无解

解答有很多种 就是解有很多 暂时该程序无法得出最优解 除非自己手动运行N次 找出最少步骤解
比如7 4  1
可行步骤有3535
  02420252525242420152520242 (0标示A装满水,具体看程序说明)
甚至353435
353434343435
就是重复步骤问题没有解决

到底是“出来混迟早要还”还是“杀人放火金腰带”?
2012-01-16 23:11
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
既然送分就醒目一些嘛

授人以渔,不授人以鱼。
2012-01-17 02:35
smallmoon521
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:4
帖 子:517
专家分:1373
注 册:2008-4-21
收藏
得分:0 
坐等算法大师
顺带接分

为游戏狂~~!!    大家努力编哈!
2012-01-17 08:08
有容就大
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:东土大唐
等 级:版主
威 望:74
帖 子:9048
专家分:14309
注 册:2011-11-11
收藏
得分:0 
贴上代码我才给分,俺很吝啬的哦。

梅尚程荀
马谭杨奚







                                                       
2012-01-17 09:24
vandychan
Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15
等 级:贵宾
威 望:18
帖 子:2296
专家分:6418
注 册:2010-8-20
收藏
得分:0 
已经贴了代码 马上给分吧

到底是“出来混迟早要还”还是“杀人放火金腰带”?
2012-01-17 10:28
有容就大
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:东土大唐
等 级:版主
威 望:74
帖 子:9048
专家分:14309
注 册:2011-11-11
收藏
得分:0 
回复 8楼 vandychan
……

梅尚程荀
马谭杨奚







                                                       
2012-01-17 10:36
laoyang103
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:内蒙古包头
等 级:贵宾
威 望:19
帖 子:3082
专家分:11056
注 册:2010-5-22
收藏
得分:0 
感觉这是个搜索题 状态空间要开三个杯子容量的乘积空间  也就是三维数组

你要找最短路径就要广度优先搜索

                                         
===========深入<----------------->浅出============
2012-01-17 10:38
快速回复:倒水问题求编程,你给力我给分!
数据加载中...
 
   



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

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