黑马程序员技术交流社区
标题:
应聘百度的一道试题
[打印本页]
作者:
闫镜湾
时间:
2014-5-23 14:50
标题:
应聘百度的一道试题
有一根27厘米的细木杆,在第3厘米、7厘米、11厘米、17厘米、23厘米这五个位置上各有一只蚂蚁。
木杆很细,不能同时通过一只蚂蚁。开始 时,蚂蚁的头朝左还是朝右是任意的,它们只会朝前走或调头,
但不会后退。当任意两只蚂蚁碰头时,两只蚂蚁会同时调头朝反方向走。假设蚂蚁们每秒钟可以走一厘米的距离。
编写程序,求所有蚂蚁都离开木杆 的最小时间和最大时间。
作者:
闫镜湾
时间:
2014-5-23 14:55
分析:题目中的蚂蚁只可能相遇在整数点,不可以相遇在其它点,比如3.5cm处之类的,也就是可以让每只蚂蚁走 1秒,然后
* 查看是否有相遇的即可.
*
* 这样我的程序实现思路就是,初始化5只蚂蚁,让每只蚂蚁走1秒,然后看是否有相遇的,如果有则做相应处理.当每只蚂蚁都
* 走出木杆时,我就记录当前时间.这样就可以得到当前状态情况下,需要多久可以走出木杆,然后遍历所有状态则可以得到所胡
* 可能.
作者:
阳春烟景
时间:
2014-5-23 17:46
这个题,在ACM中貌似见过。。用排序,好像吧。。
作者:
an1911
时间:
2014-5-23 21:34
这么难啊。。。
作者:
酱油炒饭
时间:
2014-5-23 21:38
坐等代码 求长见识~~~
作者:
Mr._Strange
时间:
2014-5-24 10:35
来围观一下,果断发现看完就懵了...
作者:
屈_zi
时间:
2014-5-24 11:54
好难啊~~
作者:
屈_zi
时间:
2014-5-24 16:39
先上代码
/**
* 模拟蚂蚁运行的木棒,木棒长度为l,有l个点,每个点上的蚂蚁数量初始化为0
* @author Administrator
*
*/
class L{
static int l = 27;
static int[] point = new int[l + 1];
static{
for(int i = 0; i < l + 1; i++){
point[i] = 0;
}
}
}
/**
* 蚂蚁类,有运动方向,初始位置,以及运动的方法及Thread的run方法,
* run方法模拟蚂蚁的实际运动
* @author Administrator
*
*/
class Ant extends Thread{
private static int[] F = {1, -1};//1向右,-1向左
private int f;
private int place;
private String name = "";
private static Object obj = new Object();
int time = 0;
//蚂蚁编号
static int num = 0;
//初始化蚂蚁的名称、运动方向(0向右,1向左)和位置
Ant(String name, int i, int place){
this.name = name;
this.f = F[i];
this.place = place;
if(L.point[place] != 0){
System.out.println("Error");
}
L.point[place] = 1;
}
//蚂蚁运动
public void run(){
//获取当前蚂蚁的编号
int c = num++;
while(place > 0 || place < L.l){
try {Thread.sleep(600);} catch (InterruptedException e) {}
//如果两只蚂蚁相遇,则调转方向,相遇设计成如果L上的某个点的蚂蚁数量大于1,
//为了保证这段代码能被安全的执行,将1s的sleep时间分成两个部分,使线程有足够的时间完成判断和调转方向
if(L.point[place] > 1){
f = -f;
System.out.println(name + " turn foward in " + place);
}
try {Thread.sleep(300);} catch (InterruptedException e) {}
place += f;
//如果已经抵达0点或者第27点,那么就离开,即设置0点和27点上的蚂蚁个数为0
//以及1和26点上的蚂蚁个数为0
if(place <= 0 || place >= L.l){
if(place <= 0){
L.point[place + 1] = 0;
}
if(place >= L.l){
L.point[L.l - 1] = 0;
}
//从1和26到0和27也需要1s的时间
time++;
break;
}
//加锁避免同时操作place,尤其两只蚂蚁到同一个点相遇的时
synchronized (obj) {
//蚂蚁到place点,则数量加1
L.point[place]++;
//蚂蚁所在的前一个位置的蚂蚁数量编程0
L.point[place - f] = 0;
}
//时间加1
time++;
}
System.out.println(name + " Time:" + time);
//保存结果到SearchTime中
SearchTime.runTime[c % 5] = time;
}
}
/**
* 搜索线程,可以搜索指定蚂蚁运动方向组合的所有蚂蚁都离开的时间
* @author Administrator
*
*/
class SearchTime extends Thread{
private int tag;
static int[] runTime = new int[5];
//搜索运动方向为tag指示的情况时的所有蚂蚁都离开L的时间
SearchTime(int tag){
this.tag = tag;
}
public void run(){
System.out.println("Start tag = " + tag);
//5只蚂蚁,方向一共有32种可能,因此tag应当是小于32大于0的数,tag的二进制
//每一个位代表一只蚂蚁的运动方向
if(tag >= 32 || tag < 0){
System.out.println("error");
}else{
Ant ant1 = new Ant("Ant1", tag & 1, 3);
Ant ant2 = new Ant("Ant2", (tag & 2) >> 1, 7);
Ant ant3 = new Ant("Ant3", (tag & 4) >> 2, 11);
Ant ant4 = new Ant("Ant4", (tag & 8) >> 3, 17);
Ant ant5 = new Ant("Ant5", (tag & 16) >> 4, 23);
ant1.start();
ant2.start();
ant3.start();
ant4.start();
ant5.start();
}
}
}
public class BaiduEm {
public static void main(String[] args) throws InterruptedException {
int[] result = new int[32];
for(int i = 0; i < 32; i++){
SearchTime st = new SearchTime(i);
st.start();
try {Thread.sleep(30000);} catch (InterruptedException e) {}
result[i] = findMax(SearchTime.runTime);
System.out.println("Max:" + result[i]);
}
System.out.println("所有蚂蚁都离开的最短时间:" + findMin(result) + "s" );
System.out.println("所有蚂蚁都离开的最长时间:" + findMax(result) + "s" );
}
/*
* 寻找一个数组中的最大值
*/
public static int findMax(int[] array){
int max = array[0];
for(int i = 0; i < array.length; i++){
max = array[i] > max ? array[i] : max;
}
return max;
}
/*
* 寻找一个数组中的最小值
*/
public static int findMin(int[] array){
int min = array[0];
for(int i = 0; i < array.length; i++){
min = array[i] < min ? array[i] : min;
}
return min;
}
}
复制代码
作者:
屈_zi
时间:
2014-5-24 16:42
运行结果摘要:
Start tag = 29
Ant3 turn foward in 9
Ant2 turn foward in 9
Ant1 Time:3
Ant4 turn foward in 12
Ant3 turn foward in 12
Ant5 turn foward in 15
Ant4 turn foward in 15
Ant2 Time:11
Ant3 Time:17
Ant5 Time:20
Ant4 Time:23
Max:23
Start tag = 30
Ant2 turn foward in 5
Ant1 turn foward in 5
Ant2 turn foward in 7
Ant3 turn foward in 7
Ant1 Time:7
Ant4 turn foward in 10
Ant3 turn foward in 10
Ant4 turn foward in 13
Ant5 turn foward in 13
Ant2 Time:11
Ant3 Time:17
Ant4 Time:23
Ant5 Time:24
Max:24
Start tag = 31
Ant1 Time:3
Ant2 Time:7
Ant3 Time:11
Ant4 Time:17
Ant5 Time:23
Max:23
所有蚂蚁都离开的最短时间:11s
所有蚂蚁都离开的最长时间:24s
这题的重点应该不是看你编程能力,而是搜索的思想,最小值很容易确定,最大值是3到27的时间,也就是第一只蚂蚁到第27点的时间,最小值容易证明,最大值是这个应该也可以证
作者:
liang090214
时间:
2014-5-24 20:28
果断学习下 。。。。。
作者:
不羁的风1230
时间:
2014-5-24 20:41
赞一个!!!
作者:
hamiguadjs
时间:
2014-5-25 00:54
这道题很有意思,惠存了,等有时间了思考下。
作者:
明日辉煌
时间:
2014-5-25 09:43
长长见识,看看各位大神的回答!嘿嘿嘿
作者:
wuhyoung
时间:
2014-5-25 10:24
百度就是百度,好难
作者:
wy_heima
时间:
2014-5-25 10:26
学习了!!!
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2