Chinaunix首页 | 论坛 | 博客
  • 博客访问: 200831
  • 博文数量: 67
  • 博客积分: 2970
  • 博客等级: 少校
  • 技术积分: 685
  • 用 户 组: 普通用户
  • 注册时间: 2010-07-23 11:36
文章分类

全部博文(67)

文章存档

2012年(2)

2011年(19)

2010年(46)

我的朋友

分类: C/C++

2010-07-24 09:54:07

某人有12升的啤酒一瓶,想从中倒出6升,但他没有6升的容器,仅有一个8升和5升的容器,怎样倒才能将啤酒分为两个6升呢?
解题思路:
先考察第一个空瓶,若其为空则由满瓶倒入补充,若其非空则考察第二个空瓶,若第二个空瓶满则将其倒入满瓶,否则比较第一个空瓶剩余的容量和第二个空瓶装满所需的容量,若前者大则第二个空瓶被装满,若后者大则第一个空瓶为空,即按照a->b->c->a的顺序依次考察
 

#include<stdio.h>

int i;                                            //目标容量

void pour(int a,int y,int z)                    //a:满瓶的容量 y:第一个空瓶的容量 z:第二个空瓶的容量

{
    int b=0,c=0;                                //a,b,c分别为各个瓶的实际容量

    printf(" a b c\n%4d%4d%4d\n",a,b,c);
    
    while(true)                    
    {
        if(a==i||b==i||c==i){break;}

        if(!b)
        { a-=y; b=y;}                        
        else if(c==z)
        { a+=z; c=0;}                        
        else if(b>z-c)                            
        { b-=(z-c);c=z;}                        
        else if(b<=z-c){ c+=b; b=0;}            
        printf("%4d%4d%4d\n",a,b,c);
    }
}

int main()
{
    int a,y,z;
    printf("input full a,empty b,c,get i:");    
    scanf("%d%d%d%d",&a,&y,&z,&i);

    pour(a,y,z);                                //a->y->z->a倒酒

    pour(a,z,y);                                //a->z->y->a倒酒

}


阅读(1051) | 评论(0) | 转发(0) |
0

上一篇:区分旅客国籍

下一篇:循环赛日程表

给主人留下些什么吧!~~