java递归斐_百度面试题---5只蚂蚁走木棍问题的递归解法(java实现)

package com.leochan;

import java.util.LinkedList;

public class RecursionAntWalker {

public static int spendTime = 0;

public static int totalLength = 27;

public static void main(String[] args) {

recursionTest();

}

// 递归计算32种不同情况下所需要的时间。

private static void recursionTest() {

int count = 0;

for (int d1 = -1; d1 <= 1; d1 += 2) {

for (int d2 = -1; d2 <= 1; d2 += 2) {

for (int d3 = -1; d3 <= 1; d3 += 2) {

for (int d4 = -1; d4 <= 1; d4 += 2) {

for (int d5 = -1; d5 <= 1; d5 += 2) {

count++;

spendTime = 0;

Ant a = new Ant(3);

Ant b = new Ant(7);

Ant c = new Ant(11);

Ant d = new Ant(17);

Ant e = new Ant(23);

a.direction = d1;

b.direction = d2;

c.direction = d3;

d.direction = d4;

e.direction = d5;

LinkedList testCase = new LinkedList();

testCase.add(a);

testCase.add(b);

testCase.add(c);

testCase.add(d);

testCase.add(e);

System.out.print("count=" + count + " d1=" + d1

+ " d2=" + d2 + " d3=" + d3 + " d4=" + d4

+ " d5=" + d5);

System.out

.println(" getTime=" + getTime(testCase));

}

}

}

}

}

}

// 递归计算每种组合需要的时间

public static int getTime(LinkedList antList) {

int len = antList.size();

// 如果antList里没有蚂蚁,直接返回spendTime

if (len == 0)

return spendTime;

// 如果antList里只有1只蚂蚁,让这种蚂蚁一直走下去,直到它达到边界。

// 在spendTime和这只蚂蚁所走过的distance中取最大值做为最终花费的时间

if (len == 1) {

Ant onlyAnt = antList.getFirst();

onlyAnt.keepWalking();

return (spendTime > onlyAnt.distance) ? spendTime

: onlyAnt.distance;

}

// 如果antList里的第一只蚂蚁的运动方向为负方向,即-1,

// 就重新计算spendTime,并且将这只蚂蚁移出list,递归去getTime

if (!antList.getFirst().positiveDirect()) {

Ant currentAnt = antList.removeFirst();

spendTime = (currentAnt.position > spendTime) ? currentAnt.position

+ currentAnt.distance : spendTime;

}

// 如果antList里最后一只蚂蚁的方向为正方向,即1

// 就重新计算spendTime,并且将这只蚂蚁移出list,递归去getTime

else if (antList.getLast().positiveDirect()) {

Ant currentAnt = antList.removeLast();

int needToGo = totalLength - currentAnt.position;

spendTime = (needToGo > spendTime) ? needToGo + currentAnt.distance

: spendTime;

}

// 其他情况下,让所有的蚂蚁按方向走一步,并判断有没有2只蚂蚁的位置重合,

// 如果有重合,就让对应的2只蚂蚁转向。

else {

for (int i = 0; i < len; i++) {

antList.get(i).walking();

if (!antList.get(i).positiveDirect()) {

if (antList.get(i).checkPosition(antList.get(i - 1))) {

antList.get(i).changedirect();

antList.get(i - 1).changedirect();

}

}

}

}

return getTime(antList);

}

}

// 蚂蚁类

class Ant {

public int distance = 0; // 走过的距离,数值上等于时间

public int position; // 当前的位置,在0-27之间

public int direction = -1; // 运动的方向,-1表示向左,1表示向右

public Ant(int position) {

this.position = position;

}

// 用来判断运动方向是否为正方向

public boolean positiveDirect() {

return direction > 0;

}

// 如果位置在0-27之间,让蚂蚁一直行走

public void keepWalking() {

while (this.position > 0

&& this.position < RecursionAntWalker.totalLength)

this.walking();

}

// 检查2只蚂蚁的位置是否相同

public boolean checkPosition(Ant ant) {

return this.position == ant.position;

}

// 让当前的蚂蚁转向

public void changedirect() {

direction = -direction;

}

// 让蚂蚁按照自己的方向走1步,即经历单位时间1.

public void walking() {

distance += 1;

position += direction;

}

}

分享到:

18e900b8666ce6f233d25ec02f95ee59.png

72dd548719f0ace4d5f9bca64e1d7715.png

2009-06-27 11:14

浏览 1127

论坛回复 / 浏览 (2 / 2611)

分类:非技术

评论

2 楼

leochan007

2009-07-04

fehly 写道

精品值得学习学习

额。。。。纯属瞎写着玩 。。。。shy

1 楼

fehly

2009-07-04

精品值得学习学习

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值