杯子倒水

本文介绍了一个基于电影《虎胆龙威3》中的经典数学难题的编程解决方案。通过使用两个容量不同的水壶,实现特定水量的精确测量。文章详细阐述了解题步骤及程序设计思路。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

导读:
  http://acm.pku.edu.cn/JudgeOnline/problem?id=1606
  /**
  *
  *
  * Jugs
  * In the movie "Die Hard 3", Bruce Willis and Samuel L. Jackson were
  * confronted with the following puzzle. They were given a 3-gallon jug
  * and a 5-gallon jug and were asked to fill the 5-gallon jug with exactly
  * 4 gallons. This problem generalizes that puzzle.
  *
  * You have two jugs, A and B, and an infinite supply of water. There are
  * three types of actions that you can use: (1) you can fill a jug, (2) you
  * can empty a jug, and (3) you can pour from one jug to the other. Pouring
  * from one jug to the other stops when the first jug is empty or the second
  * jug is full, whichever comes first. For example, if A has 5 gallons and B
  * has 6 gallons and a capacity of 8, then pouring from A to B leaves B full
  * and 3 gallons in A.
  *
  * A problem is given by a triple (Ca,Cb,N), where Ca and Cb are the
  * capacities of the jugs A and B, respectively, and N is the goal. A
  * solution is a sequence of steps that leaves exactly N gallons in jug
  * B. The possible steps are
  * fill A
  * fill B
  * empty A
  * empty B
  * pour A B
  * pour B A
  * success
  * where "pour A B" means "pour the contents of jug A into jug B", and
  * "success" means that the goal has been accomplished.
  * You may assume that the input you are given does have a solution.
  *
  * Input
  * Input to your program consists of a series of input lines each defining
  * one puzzle. Input for each puzzle is a single line of three positive
  * integers: Ca, Cb, and N. Ca and Cb are the capacities of jugs A and B,
  * and N is the goal. You can assume 0   * A and B are relatively prime to one another.
  
  * Output
  * Output from your program will consist of a series of instructions from
  * the list of the potential output lines which will result in either of the
  * jugs containing exactly N gallons of water. The last line of output for
  * each puzzle should be the line "success". Output lines start in column 1
  * and there should be no empty lines nor any trailing spaces.
  *
  * Sample Input
  * 3 5 4
  * 5 7 3
  *
  * Sample Output
  * fill B
  * pour B A
  * empty A
  * pour B A
  * fill B
  * pour B A
  * success
  * fill A
  * pour A B
  * fill A
  * pour A B
  * empty B
  * pour A B
  * success
  *
  *   *
  * @author bbflyerwww
  */
  #include
  #include
  #define MAX 10000
  char s[][10] = {"fill A",
  "fill B",
  "empty A",
  "empty B",
  "pour A B",
  "pour B A",
  "success"
  };
  char rs[MAX][10];
  int k;
  int ca, cb, n;
  int main()
  {
  int va, vb;
  while(scanf("%d %d %d", &ca, &cb, &n) != EOF) {
  //init some parameters
  va = 0;
  vb = 0;
  k = -1;
  //kernel
  while(1) {
  if(va == 0) {
  //fill A while va == 0
  va = ca;
  k ++;
  strcpy(rs[k], s[0]);
  } else {
  //do something else while va != 0
  if(va >cb - vb) {
  // va >cb - vb
  va = va - (cb - vb);
  vb = cb;
  //pour A to B
  k ++;
  strcpy(rs[k], s[4]);
  //break while vb == n notice that vb = cb now
  if(vb == n) goto end;//break;
  //empty B while vb != n
  vb = 0;
  k++;
  strcpy(rs[k], s[3]);
  } else {
  // va   vb += va;
  va = 0;
  //pour A to B
  k ++;
  strcpy(rs[k], s[4]);
  //break while vb == n notice that vb may be not full
  if(vb == n) goto end;//break;
  }
  }
  }
  end:
  //success
  k++;
  strcpy(rs[k], s[6]);
  //show the result
  for(int i = 0; i <= k; i++)
  printf("%s/n", rs[i]);
  
  }
  return 0;
  }
  附加: 灌水定理
  如果有n个壶容积分别为A1,A2,……,An(Ai均为大于0的整数)
  设w为另一大于0的整数。则用此n个壶可倒出w升水的充要条件为:
  1)w小于等于A1+A2+……+An;
  2)w可被(A1,A2,……,An)(这n个数的最大公约数)整除。
  Trackback: http://tb.blog.youkuaiyun.com/TrackBack.aspx?PostId=724522

本文转自
http://blog.youkuaiyun.com/bbflyerwww/archive/2006/05/11/724522.aspx
根据“倒水 cocos”这一问题,推测可能与游戏开发相关,尤其是使用 Cocos2d-x 或 Cocos Creator 开发的游戏中实现“倒水”效果或动画。以下是几种可能的实现方法: 在 Cocos 引擎中实现倒水效果通常涉及粒子系统和动画控制。Cocos 提供了强大的粒子系统模块,可以用于模拟液体流动、喷洒等视觉效果。 1. 使用粒子系统创建水流效果 - 创建一个 `ParticleSystemQuad` 实例,并配置其参数(如发射速率、生命周期、速度方向等),以模拟水流从容器中倒出的效果。 - 可通过调整粒子的 `startColor` 和 `endColor` 来增强视觉表现,使其看起来更像液体。 ```cpp auto particle = ParticleSystemQuad::create("water.plist"); particle->setPosition(Vec2(100, 300)); this->addChild(particle); ``` 2. 配合动画实现容器倾斜动作 - 使用 `RotateTo` 或 `RotateBy` 动作让容器对象(如瓶子或杯子)产生倾倒动画。 - 容器旋转角度变化时触发粒子系统的启动,使水流跟随动画同步播放。 ```cpp auto rotateAction = RotateTo::create(2.0f, -45.0f); // 倾斜 45 度 bottleSprite->runAction(rotateAction); ``` 3. 控制粒子系统的播放与停止 - 在容器完成倾倒动作后,可以通过代码手动停止粒子系统,避免无限播放。 - 可结合定时器或物理碰撞检测来判断“水”是否已“倒完”。 ```cpp particle->stopSystem(); // 停止粒子系统 ``` 4. 添加音效增强真实感 - 播放流水声或其他环境音效,提升用户体验。 - 使用 `SimpleAudioEngine` 播放背景音或一次性音效。 ```cpp SimpleAudioEngine::getInstance()->playEffect("water_sound.mp3"); ``` 若希望实现更真实的流体物理效果,可考虑集成第三方物理引擎(如 Box2D)进行高级模拟。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值