| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2557 人关注过本帖
标题:倒水问题
只看楼主 加入收藏
遮天云
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:农村一小伙
等 级:贵宾
威 望:12
帖 子:1132
专家分:2671
注 册:2010-6-1
结帖率:100%
收藏
已结贴  问题点数:30 回复次数:14 
倒水问题
问题如下:现有容量M、N升的两个罐子(依次记为A、B)没有任何刻度,要求从水池中量出K升水放到另一个容器里。其中M、N、K都是正整数。例如,对于M=7、N=3、K=1,可以这样操作,先用A罐量M升水,再利用B罐从A罐中量两次N升水,A罐中剩余的就是所要的一升水。编程输出操作过程,或者输出“不可能”。这道题怎么做,请教各位了。
程序代码:
[color=#0000FF]#include<stdio.h>
void main()
{
    int M,N,K,t;
    printf("请输入相关数据:\n");
    while(1)
    {
        printf("请输入A罐子的容量M:\n");
        scanf("%d",&M);
        printf("请输入B罐子的容量N:");
        scanf("%d",&N);
        printf("请输入要求K的数量:\n");
        scanf("%d",&K);
        if(M<0||N<0||K<0)
            printf("请重新输入数据:\n");
        else
            break;
    }
    t=M/N;
    if(N>M||(M-t*N)!=K)
        printf("不可能\n");
    if((M-t*N)==K)
        printf("可能\n");
}
    

[/color]上面是我写的代码!能够正确判断!可是sunyh1999版主说没有打印过程!望路过的指教一二!怎么实现!本人也在努力思考中
搜索更多相关主题的帖子: 倒水 
2010-08-29 19:03
卧龙孔明
Rank: 9Rank: 9Rank: 9
等 级:贵宾
威 望:59
帖 子:3872
专家分:684
注 册:2006-10-13
收藏
得分:0 
dp.

My Blog: www.aiexp.info
虽然我的路是从这里开始的,但是这里不再是乐土.感谢曾经影响过,引导过,帮助过我的董凯,飞燕,leeco,starwing,Rockcarry,soft_wind等等等等.别了,BCCN.
2010-08-29 19:05
遮天云
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:农村一小伙
等 级:贵宾
威 望:12
帖 子:1132
专家分:2671
注 册:2010-6-1
收藏
得分:0 
以下是引用卧龙孔明在2010-8-29 19:05:41的发言:

dp.
不懂!愿不吝赐教
2010-08-29 19:23
卧龙孔明
Rank: 9Rank: 9Rank: 9
等 级:贵宾
威 望:59
帖 子:3872
专家分:684
注 册:2006-10-13
收藏
得分:5 
状态
d[x][y]
x表示A罐剩余的水,y表示B罐剩余的水
进行动态规划并记录转移

My Blog: www.aiexp.info
虽然我的路是从这里开始的,但是这里不再是乐土.感谢曾经影响过,引导过,帮助过我的董凯,飞燕,leeco,starwing,Rockcarry,soft_wind等等等等.别了,BCCN.
2010-08-29 19:38
vandychan
Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15
等 级:贵宾
威 望:18
帖 子:2296
专家分:6418
注 册:2010-8-20
收藏
得分:25 
刚写好 经过VC6测试通过 以下是代码片段:
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
就是重复步骤问题没有解决

到底是“出来混迟早要还”还是“杀人放火金腰带”?
2010-08-30 11:02
sunyh1999
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:14
帖 子:1178
专家分:3032
注 册:2009-5-17
收藏
得分:0 
呵呵,是的,昨天看见一个人问了一个问题,感觉有些难度,所以问问LZ

欢迎来到我的博客:http://blog..cn/noisunyuhong
2010-08-30 11:38
sunyh1999
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:14
帖 子:1178
专家分:3032
注 册:2009-5-17
收藏
得分:0 
回复 5楼 vandychan
能把详细代码帖上来吗?

欢迎来到我的博客:http://blog..cn/noisunyuhong
2010-08-30 11:59
遮天云
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:农村一小伙
等 级:贵宾
威 望:12
帖 子:1132
专家分:2671
注 册:2010-6-1
收藏
得分:0 
回复 5楼 vandychan
是啊!您能把完整代码贴出来吗?谢谢
2010-08-30 13:23
vandychan
Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15
等 级:贵宾
威 望:18
帖 子:2296
专家分:6418
注 册:2010-8-20
收藏
得分:0 
以下是引用遮天云在2010-8-30 13:23:11的发言:

是啊!您能把完整代码贴出来吗?谢谢

基本上是详细的了
要不我把整个文件夹传上来?

到底是“出来混迟早要还”还是“杀人放火金腰带”?
2010-08-30 16:39
sunyh1999
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:14
帖 子:1178
专家分:3032
注 册:2009-5-17
收藏
得分:0 
好的

欢迎来到我的博客:http://blog..cn/noisunyuhong
2010-08-30 17:09
快速回复:倒水问题
数据加载中...
 
   



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

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