1. 程式人生 > >算法-猴子搬香蕉

算法-猴子搬香蕉

所在 log views cti bsp pop 實現 搬運 equals

算法-猴子搬香蕉

2018年01月28日 19:59:15 閱讀數:220

問題描述:

一個小猴子邊上有100根香蕉,它要走過50米才能到家,每次它最多搬50根香蕉。它每走1米就要吃掉一根,請問它最多能把多少根香蕉搬到家裏呢?

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

程序實現:

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


實現類:
  1. /**
  2. * @category 猴子搬香蕉問題
  3. * @author song
  4. */
  5. public class MonkeysMoveBananasImpl implements MonkeysMoveBananas {
  6. /**
  7. *
  8. * @param num 總數量 如100
  9. * @param maxNum 每次最多搬多少個 如50個
  10. * @param distance 距離 如50
  11. * @param eatNum 每走一米吃的數量, 如1個
  12. *
  13. * @return 到家剩余的數量,或者無法再搬香蕉時剩余的數量
  14. *
  15. */
  16. @Override
  17. public int Move(int num, int maxNum, int distance, int eatNum) {
  18. /* 已經搬到的位置, 即搬了幾米 */
  19. int location = 0;
  20. /* 每次搬運起始點剩的數量 */
  21. int CurrentNumberS = num;
  22. /* 每次搬運終點剩的數量 */
  23. int CurrentNumberE = 0;
  24. /* 外層循環一次, 即把所有剩余香蕉移動一個位置 */
  25. while(location < distance && CurrentNumberS > eatNum) {
  26. System.out.println("當前所在位置" + location + "有" + CurrentNumberS + "個香蕉");
  27. /* 內層循環一次, 即把剩余香蕉移動一個位置, 是移動一個位置的具體細節 */
  28. while (true) {
  29. if(CurrentNumberS > maxNum) {
  30. MoveOnePosition(location, location+1, maxNum, eatNum);
  31. CurrentNumberS -= maxNum;
  32. CurrentNumberE += maxNum -eatNum;
  33. } else {
  34. MoveOnePosition(location, location+1, CurrentNumberS, eatNum);
  35. CurrentNumberE += CurrentNumberS - eatNum;
  36. CurrentNumberS = 0;
  37. }
  38. /* 看需不需要搬起點剩下的, 即需不需要返回 */
  39. if(CurrentNumberS >= eatNum * 2) {
  40. MoveOnePosition(location+1, location, -1, eatNum);
  41. CurrentNumberE -= eatNum;
  42. } else {
  43. break;
  44. }
  45. }
  46. CurrentNumberS = CurrentNumberE;
  47. CurrentNumberE = 0;
  48. location ++;
  49. }
  50. System.out.println("剩余" + CurrentNumberS + "個");
  51. return CurrentNumberS;
  52. }
  53. /**
  54. *
  55. * @param from 起始位置
  56. * @param to 目標位置
  57. * @param number 搬的數量
  58. * @param eatNum 搬一米吃的數量
  59. */
  60. private void MoveOnePosition(int from, int to, int number, int eatNum) {
  61. if(number != -1) {
  62. System.out.println("從 " + from + " 位置搬 "+ number + " 個到 " + to + " 位置, 消耗" + eatNum + "個");
  63. } else {
  64. System.out.println("從 " + from + " 位置回到 " + to + " 位置, 消耗 " + eatNum + "個");
  65. }
  66. }
  67. }


測試類:
  1. public class MonkeysMoveBananasTest {
  2. private static MonkeysMoveBananas monkeysMoveBananas = null;
  3. @BeforeClass
  4. public static void setUpBeforeClass() throws Exception {
  5. monkeysMoveBananas = new MonkeysMoveBananasImpl();
  6. }
  7. @Test
  8. public void moveTest() {
  9. int k = monkeysMoveBananas.Move(100, 50, 50, 1);
  10. assertEquals(k, 16);
  11. k = monkeysMoveBananas.Move(1000, 50, 50, 2);
  12. assertEquals(k, 20);
  13. }
  14. }

算法-猴子搬香蕉