两个杯子倒水的问题

现在只有两只杯子,容量分别是:5升和7升,问题是:在只用这两个杯子的前提下,如何才能得到4升水?假设:水可以无限使用。

之前在做一个笔试的时候就做过类似的题目,也是两个杯子倒水的问题,今天又再次看到了这个问题,在这里贴出文章的链接https://mp.weixin.qq.com/s/OZ3hlWM84L1GXv_nZdTiqQ

文中提了一个很不错的思路:小容量的杯子不断往大杯子里面倒水,大杯子满了之后就把大杯子全倒掉。相当于用小杯子的倍数的水去对大杯子不断的取余,即可得到最后所要求的值或者因为无限循环而退出。

  • 5 % 7 = 5

  • 10 % 7 = 3

  • 15 % 7 = 1

  • 20 % 7 = 6

  • 25 % 7 = 4

最后代码的实现:

package WaterPouring;
import java.util.Scanner;

public class WaterPouring {
    public static void main(String[] args) {
        //实例代码解决:用两个较小杯子得到指定数量水的问题
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入两个小杯子的容量,用空格隔开。");

        int cup1 = sc.nextInt();
        int cup2 = sc.nextInt();

        System.out.println("请输入你希望得到多少升水,整形数字。");
        int target = sc.nextInt();

        if(cup1>cup2) {//保证杯子1的容量较小
            int tmp = cup1;
            cup1 = cup2;
            cup2 = tmp;
        }
        //因为每次都是小杯子装满水往大杯子中倒水,倒完后小杯子剩余水量总是0
        //所以只需要跟踪大杯子剩余水量即可知道整个倒水的操作过程
        System.out.println("第二个杯子的水量为: " + 0);

      //先倒一次水,主要是为了处理倒水失败的情况
        int flag = cup1 % cup2;
        System.out.println("第二个杯子的水量为: "+cup1);

        if(flag == target) {
            System.out.println("小杯往大杯倒一次水即可实现目标");
            return;
        }

        int count = 2;     
        while(true) {
            int remain = (count * cup1) % cup2;
            System.out.println("第二个杯子的水容量: "+remain);

            if(remain == target) {
                System.out.println("倒水成功,得到了目标水量");
                break;
            }else if(remain == flag) {//得到循环数列,实现不了目标
                System.out.println("倒水失败,得不到目标水量");
                break;
            }

            count++;
        }
    }
}

在这里,一直没有去仔细想过如何去编码,想用大杯去填满小杯,刚才看了后文提供的代码,自己也去动手借鉴更改后实现了一下,主要想法就是让大杯去填小杯,小杯满的时候倒掉,当小杯不满时,补满大杯然后再倒入小杯,直到大杯中水量满足要求,或者循环时退出报错。

但是这种想法需要解决的就是当大杯中剩下的水不能把小杯装满时,如何处理小杯中的水的问题。

所以我想直接用remain值记录的是大杯中的水,然后计算过程为remain值减去小杯小杯容量,当remain值小于小杯的容量时,给remain值加上一个大杯容量的值再进行继续倒水的过程,直到得出结果或者报错,下面列出我自己的代码

package com.example.jiangker.myapplication;

import java.util.Scanner;

public class WaterPouring {
    public static void main(String[] args) {
        //实例代码解决:用两个较小杯子得到指定数量水的问题
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入两个小杯子的容量,用空格隔开。");

        int cup1 = sc.nextInt();
        int cup2 = sc.nextInt();

        System.out.println("请输入你希望得到多少升水,整形数字。");
        int target = sc.nextInt();

        if(cup1>cup2) {//保证杯子1的容量较小
            int tmp = cup1;
            cup1 = cup2;
            cup2 = tmp;
 }
        //因为每次都是小杯子装满水往大杯子中倒水,倒完后小杯子剩余水量总是0
        //所以只需要跟踪大杯子剩余水量即可知道整个倒水的操作过程
        System.out.println("第二个杯子的水量为: " + 0);

        //先倒一次水,主要是为了处理倒水失败的情况
        int flag = cup2 - cup1;
        System.out.println("第二个杯子的水量为: "+cup2);

        if(flag == target) {
            System.out.println("小杯往大杯倒一次水即可实现目标");
            return;
        }

        int remain = flag;
        while(true) {
//           判断第二个杯中水是否小于第一个杯中的水,如果是,则把第二个杯中的水倒入第一个杯中且补满第二个杯中的水
//            但是在这里代码上实现的是第二个杯中的水相当于剩下的加上第二杯的容量,因为之后还是去补满第一个杯
            if(remain < cup1){
                remain += cup2;
            }
            remain -= cup1;
            System.out.println("第二个杯子的水容量: "+remain);

            if(remain == target) {
                System.out.println("倒水成功,得到了目标水量");
                break;
            }else if(remain == flag) {//得到循环数列,实现不了目标
System.out.println("倒水失败,得不到目标水量");
                break;
            }

        }
    }
}

 

文章到这里就结束了,欢迎大家给我留言

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
在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); } } } ``` 此脚本会检测鼠标是否按下并发射粒子。当鼠标按下时,粒子系统将开始发射水粒子。同时,水物体将开始旋转以模拟倒水效果。当鼠标松开时,粒子系统将停止发射水粒子。 你还可以使用声音效果和其他视觉效果来增强倒水效果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值