博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
算法-猴子搬香蕉
阅读量:6246 次
发布时间:2019-06-22

本文共 2476 字,大约阅读时间需要 8 分钟。

 

算法-猴子搬香蕉

问题描述:  

 

 一个小猴子边上有100根香蕉,它要走过50米才能到家,每次它最多搬50根香蕉。它每走1米就要吃掉一根,请问它最多能把多少根香蕉搬到家里呢?

 提示:他可以把香蕉放下往返的走,但是必须保证它每走一米都能有香蕉吃。也可以走到n米时,放下一些香蕉,拿着n根香蕉走回去重新搬50根。

 

程序实现:

 

接口:
 
  1.  
    public interface MonkeysMoveBananas {
  2.  
     
  3.  
    /**
  4.  
    *
  5.  
    * @param num 总数量 如100
  6.  
    * @param maxNum 每次最多搬多少个 如50个
  7.  
    * @param distance 距离 如50
  8.  
    * @param eatNum 每走一米吃的数量, 如1个
  9.  
    *
  10.  
    * @return 到家剩余的数量,或者无法再搬香蕉时剩余的数量
  11.  
    *
  12.  
    */
  13.  
    int Move(int num, int maxNum, int distance, int eatNum);
  14.  
    }

 

实现类:
 
  1.  
    /**
  2.  
    * @category 猴子搬香蕉问题
  3.  
    * @author song
  4.  
    */
  5.  
    public class MonkeysMoveBananasImpl implements MonkeysMoveBananas {
  6.  
     
  7.  
    /**
  8.  
    *
  9.  
    * @param num 总数量 如100
  10.  
    * @param maxNum 每次最多搬多少个 如50个
  11.  
    * @param distance 距离 如50
  12.  
    * @param eatNum 每走一米吃的数量, 如1个
  13.  
    *
  14.  
    * @return 到家剩余的数量,或者无法再搬香蕉时剩余的数量
  15.  
    *
  16.  
    */
  17.  
    @Override
  18.  
    public int Move(int num, int maxNum, int distance, int eatNum) {
  19.  
     
  20.  
    /* 已经搬到的位置, 即搬了几米 */
  21.  
    int location = 0;
  22.  
     
  23.  
    /* 每次搬运起始点剩的数量 */
  24.  
    int CurrentNumberS = num;
  25.  
     
  26.  
    /* 每次搬运终点剩的数量 */
  27.  
    int CurrentNumberE = 0;
  28.  
     
  29.  
    /* 外层循环一次, 即把所有剩余香蕉移动一个位置 */
  30.  
    while(location < distance && CurrentNumberS > eatNum) {
  31.  
    System.out.println(
    "当前所在位置" + location + "有" + CurrentNumberS + "个香蕉");
  32.  
     
  33.  
    /* 内层循环一次, 即把剩余香蕉移动一个位置, 是移动一个位置的具体细节 */
  34.  
    while (true) {
  35.  
     
  36.  
    if(CurrentNumberS > maxNum) {
  37.  
    MoveOnePosition(location, location+
    1, maxNum, eatNum);
  38.  
    CurrentNumberS -= maxNum;
  39.  
    CurrentNumberE += maxNum -eatNum;
  40.  
    }
    else {
  41.  
    MoveOnePosition(location, location+
    1, CurrentNumberS, eatNum);
  42.  
    CurrentNumberE += CurrentNumberS - eatNum;
  43.  
    CurrentNumberS =
    0;
  44.  
    }
  45.  
     
  46.  
    /* 看需不需要搬起点剩下的, 即需不需要返回 */
  47.  
    if(CurrentNumberS >= eatNum * 2) {
  48.  
    MoveOnePosition(location+
    1, location, -1, eatNum);
  49.  
    CurrentNumberE -= eatNum;
  50.  
    }
    else {
  51.  
    break;
  52.  
    }
  53.  
    }
  54.  
     
  55.  
    CurrentNumberS = CurrentNumberE;
  56.  
    CurrentNumberE =
    0;
  57.  
    location ++;
  58.  
    }
  59.  
     
  60.  
    System.out.println(
    "剩余" + CurrentNumberS + "个");
  61.  
    return CurrentNumberS;
  62.  
    }
  63.  
     
  64.  
    /**
  65.  
    *
  66.  
    * @param from 起始位置
  67.  
    * @param to 目标位置
  68.  
    * @param number 搬的数量
  69.  
    * @param eatNum 搬一米吃的数量
  70.  
    */
  71.  
    private void MoveOnePosition(int from, int to, int number, int eatNum) {
  72.  
    if(number != -1) {
  73.  
    System.out.println(
    "从 " + from + " 位置搬 "+ number + " 个到 " + to + " 位置, 消耗" + eatNum + "个");
  74.  
    }
    else {
  75.  
    System.out.println(
    "从 " + from + " 位置回到 " + to + " 位置, 消耗 " + eatNum + "个");
  76.  
    }
  77.  
    }
  78.  
    }
 
测试类:
 
  1.  
    public class MonkeysMoveBananasTest {
  2.  
     
  3.  
    private static MonkeysMoveBananas monkeysMoveBananas = null;
  4.  
     
  5.  
    @BeforeClass
  6.  
    public static void setUpBeforeClass() throws Exception {
  7.  
    monkeysMoveBananas =
    new MonkeysMoveBananasImpl();
  8.  
    }
  9.  
     
  10.  
    @Test
  11.  
    public void moveTest() {
  12.  
    int k = monkeysMoveBananas.Move(100, 50, 50, 1);
  13.  
    assertEquals(k,
    16);
  14.  
     
  15.  
    k = monkeysMoveBananas.Move(
    1000, 50, 50, 2);
  16.  
    assertEquals(k,
    20);
  17.  
    }
  18.  
    }
  19.  

转载地址:http://fmoia.baihongyu.com/

你可能感兴趣的文章
smarty插件判断图片是否存在,不存在则调用默认图片
查看>>
[转载] 晓说——第29期:海上霸主航母(上)
查看>>
05 显示网页信息
查看>>
[转载] 中华典故故事(孙刚)——37 只许州官放火,不许百姓点灯
查看>>
mysql5.7.22源码编译安装
查看>>
Java基础学习总结(23)——GUI编程
查看>>
SVN学习总结(2)——SVN冲突解决
查看>>
nagios的安装搭建以及添加监控主机
查看>>
Harbor和YUM部署for CentOS 7
查看>>
shell脚本练习一(if语句、case语句、for语句、while语句)
查看>>
Web服务(二)httpd配置参数详细介绍
查看>>
unity中射线碰撞检测总结
查看>>
Mysql触发器
查看>>
运维自动化之使用PHP+MYSQL+SHELL打造私有监控系统(七)
查看>>
ArcSDE 10.1 的安装
查看>>
python面向对象——方法
查看>>
Python--分析微信好友是否被删除
查看>>
MYSQL一些字符串的处理,如拼接,截取等,便于用在同一字段中多个值的处理...
查看>>
网络工程师
查看>>
在C#下的SQL模糊查询语句 (Visual Studio)
查看>>