| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1247 人关注过本帖
标题:向各位高手们请教一个问题
只看楼主 加入收藏
linfeng1712
Rank: 2
等 级:论坛游民
帖 子:19
专家分:12
注 册:2008-10-26
收藏
得分:1 
回复 9楼 御坂美琴
k大于M,N的时候成立吗?
2010-08-30 09:42
linfeng1712
Rank: 2
等 级:论坛游民
帖 子:19
专家分:12
注 册:2008-10-26
收藏
得分:0 
回复 10楼 xugaige
你这种说法正确的
2010-08-30 09:47
linfeng1712
Rank: 2
等 级:论坛游民
帖 子:19
专家分:12
注 册:2008-10-26
收藏
得分:0 
回复 10楼 xugaige
板姐的说法有点片面
2010-08-30 09:47
vandychan
Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15
等 级:贵宾
威 望:18
帖 子:2296
专家分:6418
注 册:2010-8-20
收藏
得分:0 
以下是引用linfeng1712在2010-8-30 09:47:46的发言:

板姐的说法有点片面
不准侮辱我的御姐
vandychan扔掉嘴里的烟,狠狠说道

到底是“出来混迟早要还”还是“杀人放火金腰带”?
2010-08-30 10:00
szw982
Rank: 2
来 自:和谐社会
等 级:论坛游民
帖 子:80
专家分:34
注 册:2010-8-18
收藏
得分:1 
哎,老一辈们看了又要叹气了!

请给我结果 我要改变任人摆布的人生!
2010-08-30 10:47
vandychan
Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15
等 级:贵宾
威 望:18
帖 子:2296
专家分:6418
注 册:2010-8-20
收藏
得分:0 
刚写好 经过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
就是重复步骤问题没有解决

[ 本帖最后由 vandychan 于 2010-8-30 10:59 编辑 ]

到底是“出来混迟早要还”还是“杀人放火金腰带”?
2010-08-30 10:55
御坂美琴
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:魔術の禁書目錄
等 级:小飞侠
威 望:9
帖 子:952
专家分:2929
注 册:2010-8-18
收藏
得分:0 
题目说:现有容量M、N升的两个罐子(依次记为A、B)没有任何刻度,要求从水池中量出K升水放到另一个容器里

如果是严格按这些字眼的说明,我认为我说的没有错误,题目根本没有要求这K升水放到另一容器只能一次性放进去,一开始先M+N地放,直到剩下不超过M+N,这样不成问题吧?
你还认为我说的片面吗?发言何必如此抓字眼?我给你提供的数学解法,思路绝对没问题,但我可不喜欢在细枝末节上纠结,这对谁都没好处

永远为正义而奋斗,锄强扶弱的Level 5 超能力者
とある魔術の禁書目錄インデックス__御み坂さか美み琴こと
http://bbs.bccn.net/space.php?action=threads&uid=483997
2010-08-30 11:02
vandychan
Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15
等 级:贵宾
威 望:18
帖 子:2296
专家分:6418
注 册:2010-8-20
收藏
得分:0 
以下是引用御坂美琴在2010-8-30 11:02:56的发言:

题目说:现有容量M、N升的两个罐子(依次记为A、B)没有任何刻度,要求从水池中量出K升水放到另一个容器里
 
如果是严格按这些字眼的说明,我认为我说的没有错误,题目根本没有要求这K升水放到另一容器只能一次性放进去,一开始先M+N地放,直到剩下不超过M+N,这样不成问题吧?
你还认为我说的片面吗?发言何必如此抓字眼?我给你提供的数学解法,思路绝对没问题,但我可不喜欢在细枝末节上纠结,这对谁都没好处
御姐先别激动嘛
有话好好说

到底是“出来混迟早要还”还是“杀人放火金腰带”?
2010-08-30 11:10
快速回复:向各位高手们请教一个问题
数据加载中...
 
   



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

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