| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2827 人关注过本帖, 1 人收藏
标题:倒水问题求编程,你给力我给分!
只看楼主 加入收藏
取消关键字高亮
share32
Rank: 7Rank: 7Rank: 7
等 级:黑侠
帖 子:214
专家分:663
注 册:2011-12-1
收藏
得分:0 
回复 22楼 beyondyf
你的代码我还是没看懂,不过我看一个多月的书。再回头看这道题,自己写了一个。利用递归函数做的。有时间指点一下阿。
WaterNext()函数如果用数组加循环应该可以替代6种方案挨个写出来。但是效率好像是一样的。
我觉的用栈应该也能替代递归函数,其实到最后就是建立一个树,树的叶子结点都是(6,6,0)。但是我不知道我这么做是不是效率不高?

#include <stdio.h>
#include <stdlib.h>
typedef struct
{
    int a,b,c;
}water;         /* 定义结构体,a,b,c分别表示三瓶水的存水量 */
water visited[400];    /* 储存到水方法 */
int count=0;    /* 储存到水次数 */
int sum=0;    /* 储存方法数 */
int minicount=100;   /* 最优方法到水次数 */
water mini[100];     /* 最优方法到水方案 */
void WaterNext(w);
void pfv()      /* 打印到水方法,并且选出最优方案 */
{
    int i;
    sum++;
    printf("方法%d: ",sum);
    for(i=0;i<count;i++)
        printf("(%d,%d,%d)  ",visited[i].a,visited[i].b,visited[i].c);
    printf("\n*************\n");
    if (count<minicount)       /* 比较选出最优方案 */
    {
        for(i=0;i<count;i++)
        {
            mini[i]=visited[i];
        }
        minicount=count;
    }
}
            
void water_check(int *a,int *b,int *c,water w)    /* 到水方式的判断 */
{
    int i,flog=1;      
    if (*a==6 && *b==6)          /* a,b存数量为6,此方案成功 */
            {
                visited[count].a=*a;
                visited[count].b=*b;
                visited[count].c=*c;
                count++;
                pfv();
                count--;
            }
            else               
            {
                for(i=0;i<count;i++)
                    if (*a==visited[i].a && *b==visited[i].b )  /* 检查次到水方式是否已经被使用 */
                    {
                        flog=0;
                        break;
                    }
               
                if (flog!=0)         /* 没有使用,记录此方式,进入下一层到水程序 */
                {
                    visited[count++]=w;
                    WaterNext(*a,*b,*c);   
                }
                else
                {
                    flog=1;         
                }
            }
            *a=w.a;       /* 恢复3个瓶子水量,尝试同一层其他到水方式 */
            *b=w.b;
            *c=w.c;
}

void WaterNext(water w)
{
    int a,b,c;
    a=w.a;
    b=w.b;
    c=w.c;
    if(a!=0)              /* 每次分别检查3个瓶子可能的6种到水方式 */
    {
        if(b!=8)
        {

            if(a>(8-b))
            {
                a=a-(8-b);
                b=8;
            }
            else
            {
                b=a+b;
                a=0;
            }
            water_check(&a,&b,&c,w);    /* 判断此种到水方式如何处理 */
        }
        if(c!=5)
        {

            if(a>(5-c))
            {
                a=a-(5-c);
                c=5;
            }
            else
            {
                c=a+c;
                a=0;
            }
            water_check(&a,&b,&c,w);
        }
    }
    if(b!=0)
    {
        
        if(a!=12)
        {
            if(b>(12-a))
            {
                b=b-(12-a);
                a=12;
            }
            else
            {
                a=a+b;
                b=0;
            }
            water_check(&a,&b,&c,w);
        }
        if (c!=5)
        {

            if(b>(5-c))
            {
                b=b-(5-c);
                c=5;
            }
            else
            {
                c=b+c;
                b=0;
            }
            water_check(&a,&b,&c,w);
        }
    }
    if(c!=0)
    {
        
        
        if (b!=8)
            {
            if(c>(8-b))
            {
                c=c-(8-b);
                b=8;
            }
            else
            {
                b=c+b;
                c=0;
            }
            water_check(&a,&b,&c,w);
        }
        if (a!=12)
        {
            

            if(c>(12-a))
            {
                c=c-(12-a);
                a=12;
            }
            else
            {
                a=a+c;
                c=0;
            }
            water_check(&a,&b,&c,w);
        }
    }
    count--;
    return;
}
   
void main()
{
    int i;
    water w1;
    w1.a=12;
    w1.b=0;
    w1.c=0;
    printf("开始!\n");
    WaterNext(w1);
    printf("\n共%d种方法,最短的是%d步:\n",sum,minicount);
    for(i=0;i<minicount;i++)
        printf("(%d,%d,%d)  ",mini[i].a,mini[i].b,mini[i].c);
    printf("\n");
}
2012-02-28 10:49
laoyang103
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:内蒙古包头
等 级:贵宾
威 望:19
帖 子:3082
专家分:11056
注 册:2010-5-22
收藏
得分:0 
经典问题  呵呵  建议楼上去OJ提交一下你的代码  网址在前面的帖子已经给出了

                                         
===========深入<----------------->浅出============
2012-02-28 19:03
有容就大
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:东土大唐
等 级:版主
威 望:74
帖 子:9048
专家分:14309
注 册:2011-11-11
收藏
得分:0 
以下是引用laoyang103在2012-2-28 19:03:29的发言:

经典问题  呵呵  建议楼上去OJ提交一下你的代码  网址在前面的帖子已经给出了
上OJ格式不对。

梅尚程荀
马谭杨奚







                                                       
2012-02-28 19:14
laoyang103
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:内蒙古包头
等 级:贵宾
威 望:19
帖 子:3082
专家分:11056
注 册:2010-5-22
收藏
得分:0 
回复 43楼 有容就大
那是你多输出了回车或者空格  但是你的结果是对的

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



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

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