| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2827 人关注过本帖, 1 人收藏
标题:倒水问题求编程,你给力我给分!
只看楼主 加入收藏
取消关键字高亮
laoyang103
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:内蒙古包头
等 级:贵宾
威 望:19
帖 子:3082
专家分:11056
注 册:2010-5-22
收藏
得分:0 
回复 16楼 有容就大
先去看看OJ的题目输入格式 然后你就明白怎么输入数据了

而且要输入的东西已经在下面注释给你了

[ 本帖最后由 laoyang103 于 2012-1-18 17:12 编辑 ]

                                         
===========深入<----------------->浅出============
2012-01-18 16:16
beyondyf
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:103
帖 子:3282
专家分:12654
注 册:2008-1-21
收藏
得分:0 
回复 20楼 share32
呵呵,我代码的原理已经在贴子开头就说过了。理解算法需要一点基础知识,建议你学点图论。

重剑无锋,大巧不工
2012-01-18 22:36
beyondyf
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:103
帖 子:3282
专家分:12654
注 册:2008-1-21
收藏
得分:0 
就这样就结贴了?还没看到楼主的代码

重剑无锋,大巧不工
2012-01-19 09:31
小赵q1
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:4
帖 子:492
专家分:777
注 册:2011-8-26
收藏
得分:0 
楼主贴不出来了,哈哈,方法都被你们想一遍了,哈哈
2012-01-19 20:08
有容就大
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:东土大唐
等 级:版主
威 望:74
帖 子:9048
专家分:14309
注 册:2011-11-11
收藏
得分:0 
回复 23楼 beyondyf
侬的代码好艰深咯,我都参不透撒。

梅尚程荀
马谭杨奚







                                                       
2012-01-20 16:50
beyondyf
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:103
帖 子:3282
专家分:12654
注 册:2008-1-21
收藏
得分:0 
你的代码呢?发上来看看吧,很想看看你的思路。有兴趣的话年后我将就这个问题及那个螺旋阵的数学解法写一个详细的分析过程来和大家交流。

重剑无锋,大巧不工
2012-01-20 19:42
有容就大
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
beyondyf
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:103
帖 子:3282
专家分:12654
注 册:2008-1-21
收藏
得分:0 
我了个去,很想好好批评一下你的,但有怕伤了你的自尊打击了你学习交流的热情。调试你的代码花了我好长时间,不感谢我天理不容

总的来说,你的思路和我与老杨的没有区别,但思维不够严谨,考虑不周全。另外,必须得批评你的代码风格。滥用全局变量和跳转把自己也绕进去了吧。函数名一会儿小写一会儿大写,go是关键字换个别的单词不就完了么。没事加那么多空行干嘛?本来一屏能放下的函数拉那么长,害我得不停搓滚轮看。

我已经改好了你的代码,除了必须修改的地方,其它基本没动以保持你代码的原貌。但你自己最好再好好优化一下你的代码,有很多没必要的东西。

问题所在都加在注释里了。

呵呵,批评归批评,我还是很看好你的,好好把基础打扎实了,多加历练应该很有前途
程序代码:
#include  <stdio.h>

int volume[] = {12, 8, 5};
int from[] = {0, 0, 1, 1, 2, 2};
int to[] = {1, 2, 0, 2, 0, 1};
int step[50][3];
int step_count = 0;
static int count = 0;
//int i; 用全局变量使各函数间的循环控制发生了相互干扰

void pour_water(int state[], int f, int t);
void tep_water(int state[]);
int appeared(int state[]);
void output();
void GO(int state[]);

int main(void)
{
    int init_state[] = {12, 0, 0};
    GO(init_state);
    if (count == 0) 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[])
{
    int i;
    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;
    return 0;    //原来的这句包含在循环之内,逻辑错误
}

void output()
{
    int i;
    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 i;
    int v12 = state[0];
    int v8 = state[1];
    int v5 = state[2];
    step_water(state);
    if (v12 == 6 && v8 == 6 && v5 == 0)
    {
        output();
        count++;
        step_count--;    //恢复序列位置
        return;
    }
    for (i = 0; i < 6; i++)
    {
        state[0] = v12;        //恢复状态位置应放在这里,你的代码被continue跳过了
        state[1] = v8;
        state[2] = v5;
        if (state[from[i]] == 0) continue;
        pour_water(state, from[i], to[i]);
        if (!appeared(state))
            GO(state);
    }
    step_count--;    //恢复序列位置
}

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

梅尚程荀
马谭杨奚







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



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

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