算法-猴子搬香蕉
阿新 • • 發佈:2018-07-14
所在 log views cti bsp pop 實現 搬運 equals
算法-猴子搬香蕉
2018年01月28日 19:59:15 閱讀數:220問題描述:
一個小猴子邊上有100根香蕉,它要走過50米才能到家,每次它最多搬50根香蕉。它每走1米就要吃掉一根,請問它最多能把多少根香蕉搬到家裏呢?
提示:他可以把香蕉放下往返的走,但是必須保證它每走一米都能有香蕉吃。也可以走到n米時,放下一些香蕉,拿著n根香蕉走回去重新搬50根。
程序實現:
接口:
- public interface MonkeysMoveBananas {
- /**
- *
-
* @param num 總數量 如100
- * @param maxNum 每次最多搬多少個 如50個
- * @param distance 距離 如50
- * @param eatNum 每走一米吃的數量, 如1個
- *
- * @return 到家剩余的數量,或者無法再搬香蕉時剩余的數量
- *
- */
- int Move(int num, int maxNum, int distance, int eatNum);
- }
實現類:
- /**
- * @category 猴子搬香蕉問題
- * @author song
- */
- public class MonkeysMoveBananasImpl implements MonkeysMoveBananas {
- /**
- *
- * @param num 總數量 如100
- * @param maxNum 每次最多搬多少個 如50個
-
* @param distance 距離 如50
- * @param eatNum 每走一米吃的數量, 如1個
- *
- * @return 到家剩余的數量,或者無法再搬香蕉時剩余的數量
- *
- */
- public int Move(int num, int maxNum, int distance, int eatNum) {
- /* 已經搬到的位置, 即搬了幾米 */
- int location = 0;
- /* 每次搬運起始點剩的數量 */
- int CurrentNumberS = num;
- /* 每次搬運終點剩的數量 */
- int CurrentNumberE = 0;
- /* 外層循環一次, 即把所有剩余香蕉移動一個位置 */
- while(location < distance && CurrentNumberS > eatNum) {
- System.out.println("當前所在位置" + location + "有" + CurrentNumberS + "個香蕉");
- /* 內層循環一次, 即把剩余香蕉移動一個位置, 是移動一個位置的具體細節 */
- while (true) {
- if(CurrentNumberS > maxNum) {
- MoveOnePosition(location, location+1, maxNum, eatNum);
- CurrentNumberS -= maxNum;
- CurrentNumberE += maxNum -eatNum;
- } else {
- MoveOnePosition(location, location+1, CurrentNumberS, eatNum);
- CurrentNumberE += CurrentNumberS - eatNum;
- CurrentNumberS = 0;
- }
- /* 看需不需要搬起點剩下的, 即需不需要返回 */
- if(CurrentNumberS >= eatNum * 2) {
- MoveOnePosition(location+1, location, -1, eatNum);
- CurrentNumberE -= eatNum;
- } else {
- break;
- }
- }
- CurrentNumberS = CurrentNumberE;
- CurrentNumberE = 0;
- location ++;
- }
- System.out.println("剩余" + CurrentNumberS + "個");
- return CurrentNumberS;
- }
- /**
- *
- * @param from 起始位置
- * @param to 目標位置
- * @param number 搬的數量
- * @param eatNum 搬一米吃的數量
- */
- private void MoveOnePosition(int from, int to, int number, int eatNum) {
- if(number != -1) {
- System.out.println("從 " + from + " 位置搬 "+ number + " 個到 " + to + " 位置, 消耗" + eatNum + "個");
- } else {
- System.out.println("從 " + from + " 位置回到 " + to + " 位置, 消耗 " + eatNum + "個");
- }
- }
- }
測試類:
- public class MonkeysMoveBananasTest {
- private static MonkeysMoveBananas monkeysMoveBananas = null;
- public static void setUpBeforeClass() throws Exception {
- monkeysMoveBananas = new MonkeysMoveBananasImpl();
- }
- public void moveTest() {
- int k = monkeysMoveBananas.Move(100, 50, 50, 1);
- assertEquals(k, 16);
- k = monkeysMoveBananas.Move(1000, 50, 50, 2);
- assertEquals(k, 20);
- }
- }
-
算法-猴子搬香蕉