杯子倒水

http://acm.pku.edu.cn/JudgeOnline/problem?id=1606

/**
 * <problem>
 *
 *                            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 < Ca <= Cb and N <= Cb <=1000 and that
 * 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
 *
 * </problem>
 *
 * @author bbflyerwww
 */

#include<stdio.h>
#include<string.h>

#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 < cb - vb
                    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个数的最大公约数)整除。  

在Unity中实现倒水效果可以通过使用物理引擎和粒子系统来实现。 首先,在场景中创建一个水杯模型,并将其放置在需要倒水的位置上。可以使用Unity内置的3D模型或导入其他3D模型。 接下来,创建一个空物体并将其重命名为“Water”。将该物体作为子物体放置在水杯中。 然后,你需要在“Water”物体上添加一个刚体组件,以便在倒水时模拟物理效果。将刚体的重力设置为0,以避免水从杯子底部漏出。 接下来,添加一个粒子系统组件并命名为“WaterParticleSystem”。将该组件的发射器形状设置为“Cone”,以便在一定范围内发射粒子。设置发射速度和生命周期以模拟倒水效果。 最后,在代码中添加以下脚本: ``` using UnityEngine; public class PourWater : MonoBehaviour { public ParticleSystem waterParticleSystem; private bool isPouring = false; void Update() { if (Input.GetMouseButtonDown(0)) { isPouring = true; waterParticleSystem.Play(); } if (Input.GetMouseButtonUp(0)) { isPouring = false; waterParticleSystem.Stop(); } if (isPouring) { transform.Rotate(Vector3.right * Time.deltaTime * 100f); } } } ``` 此脚本会检测鼠标是否按下并发射粒子。当鼠标按下时,粒子系统将开始发射水粒子。同时,水物体将开始旋转以模拟倒水效果。当鼠标松开时,粒子系统将停止发射水粒子。 你还可以使用声音效果和其他视觉效果来增强倒水效果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值