百度笔试题 蚂蚁爬杆

最近在网上看到一个蚂蚁爬杆的笔试题,很多人写出来答案公布出来了,但是都不是很满意,下面是我自己写的,大家参考

题目:有一根27厘米的细木杆,在第3厘米、7厘米、11厘米、17厘米、23厘米这五个位置上各有一只蚂蚁。木杆很细,不能同时通过一只蚂蚁。开始时,蚂蚁的头朝左还是朝右是任意的,它们只会朝前走或调头,但不会后退。当任意两只蚂蚁碰头时,两只蚂蚁会同时调头朝反方向走。假设蚂蚁们每秒钟可以走一厘米的距离。编写程序,求所有蚂蚁都离开木杆的最小时间和最大时间。


import java.util.ArrayList;
import java.util.Collections;
import java.util.List;


public class Mayi {
public static final int MAX_LENGTH = 27;
public static int[] list = {3,7,11,17,23};

/**
* @param args
*/
public static void main(String[] args) {

int[][] direct = getDirect(5);

List<Integer> result = new ArrayList<Integer>();
for(int i=0;i<direct.length;i++){
int[] start = new int[list.length];
System.arraycopy(list, 0, start, 0, list.length);
int time = move(start,direct[i],0);
result.add(time);
}
System.out.println("max time:"+Collections.max(result));
System.out.println("min time:"+Collections.min(result));

}

/**
* 递归生成方向数组
* @param n
* @return
*/
public static int[][] getDirect(int n){
if(n==1){
return new int[][]{{1},{-1}};
}
int[][] last = getDirect(n-1);
int[][] result = new int[last.length*2][n];

for(int k=0;k<last.length;k++){
result[k][0]=1;
for(int j=0;j<n-1;j++){
result[k][j+1]=last[k][j];
}
}
for(int k=0;k<last.length;k++){
result[k+last.length][0]=-1;
for(int j=0;j<n-1;j++){
result[k+last.length][j+1]=last[k][j];
}
}
return result;
}
/**
* 按照规定的起始方向走完需要的总时间
* @param list
* @param direct
* @param sum
* @return
*/
public static int move(int[] list,int[] direct,int sum){
int tmp = -1;
int distance = MAX_LENGTH;
//查看是否可能会出现碰撞
for(int i=0;i<direct.length-1;i++){
if(direct[i]==1&&direct[i+1]==-1){
if(list[i+1]-list[i]<=distance){
distance = list[i+1]-list[i];
tmp = i;
}
}
}
//如果有碰撞,递归进行下一步
if(tmp!=-1){
int time = distance/2;
for(int i=0;i<list.length;i++){
list[i] = list[i]+direct[i]*time;
}
direct[tmp]=-direct[tmp];
direct[tmp+1]=-direct[tmp+1];
return move(list,direct,sum)+time;
}else{
int time = 0;
for(int i=0;i<list.length;i++){
int des = list[i]*direct[i]<0?list[i]:MAX_LENGTH-list[i];
if(list[i]>0&&list[i]<MAX_LENGTH&&time<des){
time = des;
}
}
return sum+time;
}
}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值