| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2827 人关注过本帖, 1 人收藏
标题:倒水问题求编程,你给力我给分!
取消只看楼主 加入收藏
有容就大
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:东土大唐
等 级:版主
威 望:74
帖 子:9048
专家分:14309
注 册:2011-11-11
结帖率:99.34%
收藏(1)
已结贴  问题点数:50 回复次数:15 
倒水问题求编程,你给力我给分!
一个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
有容就大
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:东土大唐
等 级:版主
威 望:74
帖 子:9048
专家分:14309
注 册:2011-11-11
收藏
得分:0 
贴上代码我才给分,俺很吝啬的哦。

梅尚程荀
马谭杨奚







                                                       
2012-01-17 09:24
有容就大
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:东土大唐
等 级:版主
威 望:74
帖 子:9048
专家分:14309
注 册:2011-11-11
收藏
得分:0 
回复 8楼 vandychan
……

梅尚程荀
马谭杨奚







                                                       
2012-01-17 10:36
有容就大
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:东土大唐
等 级:版主
威 望:74
帖 子:9048
专家分:14309
注 册:2011-11-11
收藏
得分:0 
呀,贴代码呀,贴代码呀,贴代码呀。

梅尚程荀
马谭杨奚







                                                       
2012-01-18 00:10
有容就大
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:东土大唐
等 级:版主
威 望:74
帖 子:9048
专家分:14309
注 册:2011-11-11
收藏
得分:0 
V版是省略版本,B版的无法运行,L版的运行后需要输入好多东西?

梅尚程荀
马谭杨奚







                                                       
2012-01-18 00:16
有容就大
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:东土大唐
等 级:版主
威 望:74
帖 子:9048
专家分:14309
注 册:2011-11-11
收藏
得分:0 
回复 23楼 beyondyf
侬的代码好艰深咯,我都参不透撒。

梅尚程荀
马谭杨奚







                                                       
2012-01-20 16:50
有容就大
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:东土大唐
等 级:版主
威 望:74
帖 子:9048
专家分:14309
注 册:2011-11-11
收藏
得分:0 
我写了个,但是没有任何输出,想不出那有问题呐,求指导。
程序代码:
#include  <stdio.h>

/***************************************************************/

int volume[] = {12, 8, 5};             // 3个容器的体积

int from[] = {0, 0, 1, 1, 2, 2};       // 定义12L,8L,5L分别为0号1号2号 

int to[] = {1, 2, 0, 2, 0, 1};         // from --> to

int step[50][3];                      //  定义一个二维数组存放每倒一次的状态state[]

int step_count = 0;                   //  记录每种独立方案所需要倒水的次数

static int count = 0;                 //  记录总的方案数

int i;                                //  循环变量

/***************************************************************/

void  pour_water(int state[], int f, int t);    //  倒一次水state发生改变

void  step_water(int state[]);                  //  每倒一次水后记录state在二维数组中

int   appeared(int state[]);                    //  查看独立方案中是否有相同的状态出现,避免死循环

void  output();                                 //  如果方案可行打印其步骤

void  GO(int state[]);                          //  在初始状态下进行倒水


/***************************************************************/

int  main(void)

{
    int init_state[] = {12, 0, 0};      // 初始化状态为 12, 0, 0

    GO(init_state);                     // 寻求合理的方案

    if (count == 0)                     // 我设置了个观察状态,很遗憾Impossible都无法打印出来     

        printf("\nImpossible!\n");

    return  0;
}

/***************************************************************/


void  pour_water(int state[], int f, int t)

{
    int sub = volume[t] - state[t];

    if (state[f] < sub)

    {
        state[t] += state[f];

        state[f] = 0;
    }

    else  

    {
        state[t] = volume[t];

        state[f] -= sub;
    }
}


/***************************************************************/

void  step_water(int state[])

{
    step[step_count][0] = state[0];

        step[step_count][1] = state[1];

            step[step_count][2] = state[2];

    step_count++;
}

int   appeared(int state[])

{
    for (i = 0; i < step_count; i++)

        if ((state[0] == step[i][0]) 

            && (state[1] ==step[i][1])

            && (state[2] == step[i][2]))

            return  1;

        else 

            return  0;
}

/***************************************************************/

void output()

{
    printf("step\t12L\t8L\t5L\n");

    printf("---------------------------------------------\n");

    for (i = 0; i < step_count; i++)

    printf("%d\t%d\t%d\t%d\n", i, step[i][0], step[i][1], step[i][2]);

    printf("\n");
}

/***************************************************************/

void  GO(int state[])

{
    int v12 = state[0];

    int v8 = state[1];

    int v5 = state[2];

    step_water(state);       //  记录状态

    if (v12 == 6 && v8 == 6 && v5 == 0)

    {
        output();            //  得到合符要求的状态则打印

        count++;             //  方案数++

        return;              
    }

    for (i = 0; i < 6; i++)    // from --> to 有6种,遍历开始

    {
        if (state[from[i]] == 0 )  

            continue;       //  剔除空容器,其不能作为输出瓶               

        pour_water(state, from[i], to[i]);   //  找到一个合法的输出瓶,倒水,使state发生改变

        if (!appeared(state))  //  与前面的状态相比较,没有重复则递归调用     
           
            GO(state);           
   
        else                  //  状态重复

            continue;         //  剔除

        state[0] = v12;

        state[1] = v8;

        state[2] = v5;         //  状态复原,保证循环中下一个i的初始状态       
    }
}

图片附件: 游客没有浏览图片的权限,请 登录注册



梅尚程荀
马谭杨奚







                                                       
2012-01-20 19:44
有容就大
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:东土大唐
等 级:版主
威 望:74
帖 子:9048
专家分:14309
注 册:2011-11-11
收藏
得分:0 
回复 26楼 beyondyf
B版帮看看我写的,你的代码真的很有深度,俺很难看懂啊。

梅尚程荀
马谭杨奚







                                                       
2012-01-20 19:48
有容就大
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:东土大唐
等 级:版主
威 望:74
帖 子:9048
专家分:14309
注 册:2011-11-11
收藏
得分:0 
回复 29楼 beyondyf
B版,大哥啊,你叫俺咋感谢你哪,看了你帮我修改的程序,我运行得到了正确结果,那叫一个内牛满面啊。
哈哈 我的空格是不是加过头了~~。总之,灰常感谢啊。要多多向您学习。

梅尚程荀
马谭杨奚







                                                       
2012-01-20 22:15
有容就大
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:东土大唐
等 级:版主
威 望:74
帖 子:9048
专家分:14309
注 册:2011-11-11
收藏
得分:0 
为了看到全部的 显示我加了个    if (count % 5 == 0)

                               system("pause");

还有些东西,需要思考,我继续优化。

梅尚程荀
马谭杨奚







                                                       
2012-01-20 22:18
快速回复:倒水问题求编程,你给力我给分!
数据加载中...
 
   



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

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