百度面试题的java实现

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

java实现代码

public   class  test_ant
{
    
private   int [] ants  =   new   int [ 5 ];
    
//  1:左 2:右
     private   int  enumDirection[][]  =   new   int [ 32 ][ 5 ];
    
private   void  initDirection()
    {
        
for  ( int  i  =   16 , column  =   0 ; i  >   0 ; i  =  i  /   2 , column ++ )
        {
            
int  n  =   1 ;
            
for  ( int  j  =   0 ; j  <   32 ; j ++ )
            {
                
if ((j  /  i)  %   2   ==   0 )
                    enumDirection[j][column] 
=   1 ;
                
else
                    enumDirection[j][column] 
=   2 ;
            }
        }
    }
    
private   boolean  checkAnts()
    {
        
for  ( int  i  =   0 ; i  <   5 ; i ++ )
        {
            
if  (ants[i]  >   0   &&  ants[i]  <   28 )
                
return   true ;
        }
        
return   false ;
    }
    
private   void  changeDirection( int  row,  int  col)
    {
        
if  (enumDirection[row][col]  ==   1 )
            enumDirection[row][col] 
=   2 ;
        
else
            enumDirection[row][col] 
=   1 ;
    }
    
public   void  antClimb()
    {
        initDirection();
        
for  ( int  n  =   0 ; n  <   32 ; n ++ )
        {
            
int  seconds  =   0 ;
            ants[
0 =   3 ;
            ants[
1 =   7 ;
            ants[
2 =   11 ;
            ants[
3 =   17 ;
            ants[
4 =   23 ;
            
while  (checkAnts())
            {
                seconds
++ ;
                
for  ( int  i  =   0 ; i  <  ants.length; i ++ )
                {
                    
if  (i  <  ants.length  -   1 )
                    {
                        
//  蚂蚁相遇
                         if  ((ants[i]  ==  ants[i  +   1 ])
                                        
&&  ((enumDirection[n][i]  +  enumDirection[n][i  +   1 ])  ==   3 ))
                        {
                            changeDirection(n, i);
                            changeDirection(n, i 
+   1 );
                        }
                    }
                    
if  (enumDirection[n][i]  ==   1 )
                        ants[i]
-- ;
                    
else
                        ants[i]
++ ;
                }
            }
            
for  ( int  j  =   0 ; j  <   5 ; j ++ )
                System.out.print(enumDirection[n][j]);
            System.out.println(
"" );
            System.out.println(seconds);
        }
    }
    
public   static   void  main(String[] args)
    {
        
new  test_ant().antClimb();
    }
}


其中ants数组保存了5只蚂蚁当前在竿上的位置
enumDirection枚举了所有的32种初始化方向,1代表向左,2代表向右

最短11秒, 最大25秒

运行结果

11111
23
11112
17
11112
23
11122
11
11112
23
11122
17
11122
23
11222
17
11112
23
11122
21
11122
23
11222
21
11122
23
11222
21
11222
23
12222
21
11112
25
11122
25
11122
25
11222
25
11122
25
11222
25
11222
25
12222
25
11122
25
11222
25
11222
25
12222
25
11222
25
12222
25
12222
25
22222

25





 本文转自 androidguy 51CTO博客,原文链接:http://blog.51cto.com/androidguy/215573,如需转载请自行联系原作者


相关文章
|
29天前
|
Java 程序员
java线程池讲解面试
java线程池讲解面试
52 1
|
18小时前
|
JavaScript 前端开发 Java
【JAVA面试题】什么是引用传递?什么是值传递?
【JAVA面试题】什么是引用传递?什么是值传递?
|
2天前
|
存储 安全 Java
[Java基础面试题] Map 接口相关
[Java基础面试题] Map 接口相关
|
2天前
|
Java
[Java 面试题] ArrayList篇
[Java 面试题] ArrayList篇
|
3天前
|
Java 调度
Java面试必考题之线程的生命周期,结合源码,透彻讲解!
Java面试必考题之线程的生命周期,结合源码,透彻讲解!
30 1
|
3天前
|
设计模式 搜索推荐 Java
面试官不按套路出牌,上来就让聊一聊Java中的迭代器(Iterator ),夺命连环问,怎么办?
面试官不按套路出牌,上来就让聊一聊Java中的迭代器(Iterator ),夺命连环问,怎么办?
12 0
|
3天前
|
存储 安全 Java
每日一道Java面试题:说一说Java中的泛型?
今天的每日一道Java面试题聊的是Java中的泛型,泛型在面试的时候偶尔会被提及,频率不是特别高,但在日后的开发工作中,却是是个高频词汇,因此,我们有必要去认真的学习它。
15 0
|
3天前
|
Java 编译器
每日一道Java面试题:方法重载与方法重写,这把指定让你明明白白!
每日一道Java面试题:方法重载与方法重写,这把指定让你明明白白!
15 0
|
8天前
|
XML 缓存 Java
Java大厂面试题
Java大厂面试题
20 0
|
8天前
|
存储 安全 Java
Java大厂面试题
Java大厂面试题
15 0