JR 精品文章 - 百度面试题(算法)
AD: jr (at) javaresearch.org


首页 | 动态 | 文章 | FAQ  | 新闻 | 下载 | 代码 | 工作 | 调查 | 术语 | 站点 | 图书 | 论坛 | 帮助 | 全部  

TOP | 交流 | 软件 | 专栏 | 开源 | 译/著 | 源码 | API  | 推荐 | FTP  | 积分 | 统计 | 搜索 | Blog | 我们  
首页 » 研究文集 » J2SE综合 搜索标题相关文章 搜索标题相关文章    评论此文章 发表评论     开始监控此文章 开始监控   加入收藏夹  加入收藏夹
百度面试题(算法)
bleakoasis 原创   更新:2006-11-13 17:11:43  版本: 1.0   

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


模拟每秒钟5只蚂蚁的情况。在生成Ant对象时确定蚂蚁的运行方向和名字。代码如下:
public class Ant {
    //蚂蚁的位置
    private int position;
    //爬行方向
    private boolean front_flg;
    //是否到达终点
    private boolean isOver = false;
    //蚂蚁的名字
    private String antName;
    public boolean isOver() {
        if((position == 0)||(position == 27)){
            isOver = true;
        } else {
            isOver = false;
        }
        return isOver;
    }
    public void setOver(boolean isOver) {
        this.isOver = isOver;
    }
    public String getAntName() {
        return antName;
    }
    public void setAntName(String antName) {
        this.antName = antName;
    }
    public boolean isFront_flg() {
        return front_flg;
    }
    public void setFront_flg(boolean front_flg) {
        this.front_flg = front_flg;
    }
    public void setPosition(int position) {
        this.position = position;
    }
    //构造方法
    public Ant (int position,boolean flg,String antName){
        this.position = position;
        this.front_flg = flg;
        this.antName = antName;
    }
    public void crawl(boolean front_flg){
        //根据爬行方向判断position的加减
        if(!(isOver())){
            if (front_flg){
                position = position + 1;
            } else {
                position = position - 1;
            }
        }
        System.out.println(antName + " has arrived position : " + position);
    }
    public int getPosition() {
        return position;
    }
    
    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Ant ant3 = new Ant (3,true,"ant3");
        Ant ant7 = new Ant (7,true,"ant7");
        Ant ant11 = new Ant (11,true,"ant11");
        Ant ant17 = new Ant (17,false,"ant17");
        Ant ant23 = new Ant (23,false,"ant23");
        //记录爬行时间
        int useTime = 1;
        while(!(ant3.isOver()
                &&ant7.isOver()
                &&ant11.isOver()
                &&ant17.isOver()
                &&ant23.isOver())){
            
            //如果两只蚂蚁相遇则调转爬行方向
            if (ant3.getPosition()==ant7.getPosition()){
                boolean temp;
                temp = ant3.isFront_flg();
                ant3.setFront_flg(ant7.isFront_flg());
                ant7.setFront_flg(temp);
            }
            if (ant3.getPosition()==ant11.getPosition()){
                boolean temp;
                temp = ant3.isFront_flg();
                ant3.setFront_flg(ant11.isFront_flg());
                ant11.setFront_flg(temp);
            }
            if (ant3.getPosition()==ant17.getPosition()){
                boolean temp;
                temp = ant3.isFront_flg();
                ant3.setFront_flg(ant17.isFront_flg());
                ant17.setFront_flg(temp);
            }
            if (ant3.getPosition()==ant23.getPosition()){
                boolean temp;
                temp = ant3.isFront_flg();
                ant3.setFront_flg(ant23.isFront_flg());
                ant23.setFront_flg(temp);
            }
            
            if (ant7.getPosition()==ant11.getPosition()){
                boolean temp;
                temp = ant7.isFront_flg();
                ant7.setFront_flg(ant11.isFront_flg());
                ant11.setFront_flg(temp);
            }
            if (ant7.getPosition()==ant17.getPosition()){
                boolean temp;
                temp = ant7.isFront_flg();
                ant7.setFront_flg(ant17.isFront_flg());
                ant17.setFront_flg(temp);
            }
            if (ant7.getPosition()==ant23.getPosition()){
                boolean temp;
                temp = ant7.isFront_flg();
                ant7.setFront_flg(ant23.isFront_flg());
                ant23.setFront_flg(temp);
            }
            
            if (ant11.getPosition()==ant17.getPosition()){
                boolean temp;
                temp = ant11.isFront_flg();
                ant11.setFront_flg(ant17.isFront_flg());
                ant17.setFront_flg(temp);
            }
            if (ant11.getPosition()==ant23.getPosition()){
                boolean temp;
                temp = ant11.isFront_flg();
                ant11.setFront_flg(ant23.isFront_flg());
                ant23.setFront_flg(temp);
            }
            
            if (ant17.getPosition()==ant23.getPosition()){
                boolean temp;
                temp = ant17.isFront_flg();
                ant17.setFront_flg(ant23.isFront_flg());
                ant23.setFront_flg(temp);
            }
            //蚂蚁爬行
            ant3.crawl(ant3.isFront_flg());            
            ant7.crawl(ant7.isFront_flg());            
            ant11.crawl(ant11.isFront_flg());            
            ant17.crawl(ant17.isFront_flg());            
            ant23.crawl(ant23.isFront_flg());            
            System.out.println("Use time is :" + useTime++);
            System.out.println("================================");
        }
    }
}

希望喜欢研究java的朋友一起交流
MSN:dl_lgj@hotmail.com
QQ:  77860880

版权声明   给作者写信
本篇文章对您是否有帮助?  投票:         投票结果:     9       0
作者其它文章: 作者全部文章
评论人:lifeizhou714 发表时间: Mon Nov 13 20:02:43 CST 2006
朋友,我觉得这段代码有点逻辑错误.
 //如果两只蚂蚁相遇则调转爬行方向
            if (ant3.getPosition()==ant7.getPosition()){
                boolean temp;
                temp = ant3.isFront_flg();
                ant3.setFront_flg(ant7.isFront_flg());
                ant7.setFront_flg(temp);
            }
            if (ant3.getPosition()==ant11.getPosition()){
                boolean temp;
                temp = ant3.isFront_flg();
                ant3.setFront_flg(ant11.isFront_flg());
                ant11.setFront_flg(temp);
            }
            if (ant3.getPosition()==ant17.getPosition()){
                boolean temp;
                temp = ant3.isFront_flg();
                ant3.setFront_flg(ant17.isFront_flg());
                ant17.setFront_flg(temp);
            }
            if (ant3.getPosition()==ant23.getPosition()){
                boolean temp;
                temp = ant3.isFront_flg();
                ant3.setFront_flg(ant23.isFront_flg());
                ant23.setFront_flg(temp);
            }
            
            if (ant7.getPosition()==ant11.getPosition()){
                boolean temp;
                temp = ant7.isFront_flg();
                ant7.setFront_flg(ant11.isFront_flg());
                ant11.setFront_flg(temp);
            }
            if (ant7.getPosition()==ant17.getPosition()){
                boolean temp;
                temp = ant7.isFront_flg();
                ant7.setFront_flg(ant17.isFront_flg());
                ant17.setFront_flg(temp);
            }
            if (ant7.getPosition()==ant23.getPosition()){
                boolean temp;
                temp = ant7.isFront_flg();
                ant7.setFront_flg(ant23.isFront_flg());
                ant23.setFront_flg(temp);
            }
            
            if (ant11.getPosition()==ant17.getPosition()){
                boolean temp;
                temp = ant11.isFront_flg();
                ant11.setFront_flg(ant17.isFront_flg());
                ant17.setFront_flg(temp);
            }
            if (ant11.getPosition()==ant23.getPosition()){
                boolean temp;
                temp = ant11.isFront_flg();
                ant11.setFront_flg(ant23.isFront_flg());
                ant23.setFront_flg(temp);
            }
            
            if (ant17.getPosition()==ant23.getPosition()){
                boolean temp;
                temp = ant17.isFront_flg();
                ant17.setFront_flg(ant23.isFront_flg());
                ant23.setFront_flg(temp);
            }
评论人:java2benice 发表时间: Tue Nov 14 06:24:13 CST 2006
//code below

import java.util.*;

class Ant {

    boolean left;
    int pos;

    Ant(int pos) {

        this.pos = pos;

    }

    boolean isOut() {

        return pos < 0 || pos > 27;

    }

}

class Test {

    Ant[] ants;

    Test(Ant[] ants) {

        this.ants = ants;

    }
    
    boolean isCollision(Ant antLeft, Ant antRight) {    
        
        return antRight.left&&!antLeft.left&&antRight.pos-antLeft.pos<=1;

    }

    void turnAround(Ant antLeft, Ant antRight) {

        antLeft.left=true;
        antRight.left=false;
        
    }

    void tryCrawl(int begin,int end) {

        for (int i=begin;i<end;i++)         
            if(!ants[i].isOut()&&isCollision(ants[i],ants[i+1])) {
                turnAround(ants[i],ants[i+1]);
                tryCrawl(begin,i-1);
                tryCrawl(i+1,end);
            }    

    }
                    
    void crawl() {

        for(Ant ant:ants)
            if(ant.left)
                --ant.pos;
            else
                ++ant.pos;

    }

    boolean isOver() {
    
        boolean over = true;
    
        for(Ant ant:ants) over = over && ant.isOut();
        return over;
        
    }
         
    public static void main(String[] args) {
        
        Ant[] ants = new Ant[5];
        Test t = new Test(ants);
        List<Integer> list = new ArrayList<Integer>();
        int time;
                            
        boolean[] bb0 = {true,false};
        boolean[] bb1 = {true,false};
        boolean[] bb2 = {true,false};
        boolean[] bb3 = {true,false};
        boolean[] bb4 = {true,false};

        for (int i0=0;i0<2;i0++)                         
            for (int i1=0;i1<2;i1++) 
                for (int i2=0;i2<2;i2++)     
                    for (int i3=0;i3<2;i3++)     
                        for (int i4=0;i4<2;i4++) {

                            ants[0] = new Ant(3);
                            ants[1] = new Ant(7);
                            ants[2] = new Ant(11);
                            ants[3] = new Ant(17);
                            ants[4] = new Ant(23);

                            ants[0].left = bb0[i0];
                            ants[1].left = bb1[i1];
                            ants[2].left = bb2[i2];
                            ants[3].left = bb3[i3];
                            ants[4].left = bb4[i4];

                            time = 0;
                            
                            while (!t.isOver()) {

                                t.tryCrawl(0,3);
                                t.crawl();
                                ++ time;
                                
                            }

                            System.out.println("time " + time);

                            list.add(time);                        
                        
                        }

        Collections.sort(list);
        System.out.println("minTime " + list.get(0));
        System.out.println("maxTime " + list.get(list.size()-1));

    }

}

//output below

/*
time 24
time 18
time 24
time 12
time 24
time 18
time 24
time 17
time 24
time 21
time 24
time 21
time 24
time 21
time 24
time 21
time 25
time 25
time 25
time 25
time 25
time 25
time 25
time 25
time 25
time 25
time 25
time 25
time 25
time 25
time 25
time 25
minTime 12
maxTime 25
*/
评论人:java2benice 发表时间: Tue Nov 14 06:29:56 CST 2006
附件:Test.java(2K) 附件:log.txt(0K) 
评论人:sntuuje 发表时间: Tue Nov 14 08:58:04 CST 2006
作者思路清晰,非常好,值得我们学习。
不过有一些代码可以省略,不相邻的蚂蚁不会相遇的,所以我们可以把不相邻的蚂蚁相遇的这些情况的代码删除掉。这样节省了一些运行开支。
 /*   if (ant3.getPosition()==ant11.getPosition()){
                boolean temp;
                temp = ant3.isFront_flg();
                ant3.setFront_flg(ant11.isFront_flg());
                ant11.setFront_flg(temp);
            }
            if (ant3.getPosition()==ant17.getPosition()){
                boolean temp;
                temp = ant3.isFront_flg();
                ant3.setFront_flg(ant17.isFront_flg());
                ant17.setFront_flg(temp);
            }
            if (ant3.getPosition()==ant23.getPosition()){
                boolean temp;
                temp = ant3.isFront_flg();
                ant3.setFront_flg(ant23.isFront_flg());
                ant23.setFront_flg(temp);
            }*/

/* if (ant7.getPosition()==ant17.getPosition()){
                boolean temp;
                temp = ant7.isFront_flg();
                ant7.setFront_flg(ant17.isFront_flg());
                ant17.setFront_flg(temp);
            }
            if (ant7.getPosition()==ant23.getPosition()){
                boolean temp;
                temp = ant7.isFront_flg();
                ant7.setFront_flg(ant23.isFront_flg());
                ant23.setFront_flg(temp);
            }
            */
 /* if (ant11.getPosition()==ant23.getPosition()){
                boolean temp;
                temp = ant11.isFront_flg();
                ant11.setFront_flg(ant23.isFront_flg());
                ant23.setFront_flg(temp);
            }
            */
评论人:bleakoasis 发表时间: Tue Nov 14 09:32:53 CST 2006
多谢sntuuje指点,急于求成居然疏忽了这么重要的一点。
评论人:joy_here 发表时间: Wed Nov 15 09:08:05 CST 2006
You've specified all directions of all ants. Then how do you plan to get the minimum and maximum cost of time?
评论人:linkehong 发表时间: Wed Nov 15 11:22:57 CST 2006
最小时间只用11秒,最大时间24秒。
评论人:linkehong 发表时间: Wed Nov 15 11:25:37 CST 2006
我一朋友研究出了快速算法,很简单明了,可以直接得出答案。详情稍后附上
评论人:简单 发表时间: Wed Nov 15 15:23:04 CST 2006
    //蚂蚁的位置
    private int position;
不要定义成int[w]
评论人:简单 发表时间: Wed Nov 15 15:24:12 CST 2006
    //蚂蚁的位置
    private int position;
不要用int[w]
评论人:简单 发表时间: Wed Nov 15 15:25:39 CST 2006
    //蚂蚁的位置
    private int position;
不要用int
评论人:简单 发表时间: Wed Nov 15 17:32:47 CST 2006
好像只需要求出蚂蚁之间0碰撞,和最大碰撞的场合,遍历六个值就可以
0碰撞4个场合
最大碰撞2个场合
评论人:简单 发表时间: Wed Nov 15 17:35:58 CST 2006
好像只需要遍历0碰撞和最大碰撞就可以了
用6个值就可以得出2个结果了
评论人:为爱走西川 发表时间: Wed Nov 15 18:29:52 CST 2006
上面写的实现还可以,其实除了这些之外,我认为有点更重要的东西才是他们考察的项目,如何推出min和max的公式,其实可以推出通用公式的,考虑一下蚂蚁碰头的最小次数和最大次数,就不难推出了,就像1+2+3....+100的面试题一样,在于通用公式
评论人:geyiaffh 发表时间: Wed Nov 15 20:12:08 CST 2006
作者的怎么不能得出时间?time错了   
评论人:linkehong 发表时间: Thu Nov 16 13:07:33 CST 2006
考虑到要所有的蚂蚁都爬出木竿,当两只蚂蚁相撞可以等效为两只蚂蚁互相穿透了,这个是关键点。 所以最大的就是在3厘米位置的蚂蚁爬到27,时间为24秒。
评论人:suifeng 发表时间: Thu Nov 16 18:35:51 CST 2006

public class Call {

    public static void main(String[] args) {
        call();
    }

    static int[] AXIS = new int[] {3,7,11,17,23};
    
//计算最大最小值
    public static void call() {
        
        int[] axis = new int[5]; // 蚂蚁坐标
        int[] speed = new int[5]; // 速度 (感觉速度比方向更好理解,就命名为速度)
        boolean[] isOut = new boolean[5];//是否出去
    
        int maxTime = 0;
        int minTime = Integer.MAX_VALUE;
        
        //给出蚂蚁最初的方向 一共2^5=32种 (这些组合是通过二进制表达出来)
        for (int i=32; i<64; i++) {
            reset(axis,speed,isOut);        
    
            String speedStr = Integer.toString(i,2); //组合
            
            for (int j=1; j<speedStr.length(); j++) {
                speed[j-1] = speedStr.charAt(j) == '0' ? -1 : 1;
            }
            int time = getTime(axis,speed,isOut);  // 当给出一种初始速度时,计算时间
        
            maxTime = time > maxTime ? time : maxTime;
            minTime = time < minTime ? time : minTime;
            
            System.out.println("time : " + time);
        }
    
        System.out.println("max time : " + maxTime);
        System.out.println("min time : " + minTime);
    }
    
    
    public static void reset(int[] axis, int[] speed, boolean[] isOut) {
        for (int i=0; i<axis.length; i++) {
            speed[i] = 0;
            axis[i] = AXIS[i];
            isOut[i] = false;
        }    
    }
    
    // 当给出一种初始速度时,计算时间
    public static int getTime(int[] axis, int[] speed, boolean[] isOut) {
        int time = 0;
        while(!isAllOut(isOut)) {
        
            move(axis,speed);//蚂蚁移动
    
            doWhenTouch(axis,speed,isOut);//蚂蚁出去
    
            doWhenOut(axis,isOut);   //蚂蚁相碰
            time ++; //时间流动
        }
        
        return time;
    }
    
    //判断是否蚂蚁都出去了
    public static boolean isAllOut(boolean[] isOut) {
        
        boolean isAllOut = true;
        for (int i=0; i<isOut.length; i++) {
            isAllOut = isAllOut && isOut[i];
        }
    
        return isAllOut;
    }
    
    //蚂蚁移动
    public static void move(int[] axis, int[] speed) {
        for (int i=0; i<axis.length; i++) {
            axis[i] += speed[i];
        }
    }
    //蚂蚁相碰
    public static void doWhenTouch(int[] axis, int[] speed, boolean[] isOut) {
    
        for (int i=0; i<axis.length-1; i++) {
            if (isOut[i] || isOut[i+1]) {
                continue;
            }
    
            if (axis[i] == axis[i+1]) {
                speed[i] *= -1;
                speed[i+1] *= -1;
            }
        }
    }
    //蚂蚁出去
    public static void doWhenOut(int[] axis, boolean[] isOut) {
        for (int i=0; i<axis.length; i++) {
            if (axis[i] == 27 || axis[i] == 0) {
                isOut[i] = true;
            }
        }
    }
}
time : 23
time : 17
time : 23
time : 11
time : 23
time : 17
time : 23
time : 16
time : 23
time : 20
time : 23
time : 20
time : 23
time : 20
time : 23
time : 20
time : 24
time : 24
time : 24
time : 24
time : 24
time : 24
time : 24
time : 24
time : 24
time : 24
time : 24
time : 24
time : 24
time : 24
time : 24
time : 24
max time : 24
min time : 11

评论人:suifeng 发表时间: Thu Nov 16 18:43:25 CST 2006


public class Call {

    public static void main(String[] args) {
        call();
    }

    static int[] AXIS = new int[] {3,7,11,17,23};
    
//计算最大最小值
    public static void call() {
        
        int[] axis = new int[5];// 蚂蚁坐标
        int[] speed = new int[5]; // 速度 (感觉速度比方向更好理解,就命名为速度)
        boolean[] isOut = new boolean[5];//是否出去
    
        int maxTime = 0;
        int minTime = Integer.MAX_VALUE;
        
        //给出蚂蚁最初的方向 一共2^5=32种 (这些组合是通过二进制表达出来)
        for (int i=32; i<64; i++) {
            reset(axis,speed,isOut);        
    
            String speedStr = Integer.toString(i,2); //组合
            
            for (int j=1; j<speedStr.length(); j++) {
                speed[j-1] = speedStr.charAt(j) == '0' ? -1 : 1;
            }
            int time = getTime(axis,speed,isOut);
        
            maxTime = time > maxTime ? time : maxTime;
            minTime = time < minTime ? time : minTime;
            
            System.out.println("time : " + time);
        }
    
        System.out.println("max time : " + maxTime);
        System.out.println("min time : " + minTime);
    }
    
    
    public static void reset(int[] axis, int[] speed, boolean[] isOut) {
        for (int i=0; i<axis.length; i++) {
            speed[i] = 0;
            axis[i] = AXIS[i];
            isOut[i] = false;
        }    
    }
    
    // 当给出一种初始速度时,计算时间
    public static int getTime(int[] axis, int[] speed, boolean[] isOut) {
        int time = 0;
        while(!isAllOut(isOut)) {
        
            move(axis,speed);//蚂蚁移动
    
            doWhenTouch(axis,speed,isOut);//蚂蚁出去
    
            doWhenOut(axis,isOut);   //蚂蚁相碰
            time ++; //时间流动
        }
        
        return time;
    }
    
    //判断是否蚂蚁都出去了
    public static boolean isAllOut(boolean[] isOut) {
        
        boolean isAllOut = true;
        for (int i=0; i<isOut.length; i++) {
            isAllOut = isAllOut && isOut[i];
        }
    
        return isAllOut;
    }
    
    //蚂蚁移动
    public static void move(int[] axis, int[] speed) {
        for (int i=0; i<axis.length; i++) {
            axis[i] += speed[i];
        }
    }
    //蚂蚁相碰
    public static void doWhenTouch(int[] axis, int[] speed, boolean[] isOut) {
    
        for (int i=0; i<axis.length-1; i++) {
            if (isOut[i] || isOut[i+1]) {
                continue;
            }
    
            if (axis[i] == axis[i+1]) {
                speed[i] *= -1;
                speed[i+1] *= -1;
            }
        }
    }
    //蚂蚁出去
    public static void doWhenOut(int[] axis, boolean[] isOut) {
        for (int i=0; i<axis.length; i++) {
            if (axis[i] == 27 || axis[i] == 0) {
                isOut[i] = true;
            }
        }
    }
}
time : 23
time : 17
time : 23
time : 11
time : 23
time : 17
time : 23
time : 16
time : 23
time : 20
time : 23
time : 20
time : 23
time : 20
time : 23
time : 20
time : 24
time : 24
time : 24
time : 24
time : 24
time : 24
time : 24
time : 24
time : 24
time : 24
time : 24
time : 24
time : 24
time : 24
time : 24
time : 24
max time : 24
min time : 11

评论人:oboaix 发表时间: Fri Nov 17 17:04:07 CST 2006
最小时间明显11秒,工作继续...
评论人:forscan 发表时间: Sat Nov 18 11:16:26 CST 2006
自己也写了一个,结果最小是11,最大是24.请多指教:
package puzzle;

import puzzle.Ant;
//import java.math

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

    /*
     * 判断两只蚂蚁是否碰头
     */
    public static void meet(Ant a,Ant b){
        if(a.getPosition() == b.getPosition()){
            String temp = a.getDirection();
            a.setDirection(b.getDirection());
            b.setDirection(temp);
        }    
    }
    
    /*
     * 产生蚂蚁的随机方向
     */
    public static String dir(int d){
        if(d == 0){
            return "left";
        }else if(d == 1){
            return "right";
        }else{
            return "no dir";
        }
    }
    /*
     * 计算最小时间和最大时间
     */
    public static void comput(int t){
        if(t>maxtime){
            maxtime = t;
            System.out.println("maxtime is "+maxtime);
        }else if(t<mintime){
            mintime = t;
            System.out.println("mintime is "+mintime);
        }else{
            System.out.println("current is "+t);
        }
    }
    public static void main(String[] args) {

        for(int i=0;i<2;i++){
            for(int j=0;j<2;j++){
                for(int z=0;z<2;z++){
                    for(int x=0;x<2;x++){
                        for(int y=0;y<2;y++){
                            time = 0;
                            Ant ant3 = new Ant("ant3", 3, dir(i));
                            Ant ant7 = new Ant("ant7", 7, dir(j));
                            Ant ant11 = new Ant("ant11", 11, dir(z));
                            Ant ant17 = new Ant("ant17", 17, dir(x));
                            Ant ant23 = new Ant("ant23", 23, dir(y));
                            //判断是否所有的蚂蚁都离开木杆
                            while (!ant3.isOut() || !ant7.isOut() || !ant11.isOut() || !ant17.isOut()
                                    || !ant23.isOut()) {
                                ant3.move();
                                ant7.move();
                                ant11.move();
                                ant17.move();
                                ant23.move();
                                time++;
                                
                                meet(ant3,ant7);
                                meet(ant7,ant11);
                                meet(ant11,ant17);
                                meet(ant17,ant23);
                            }
                            comput(time);
                        }
                    }
                }
            }
        }
        System.out.println("maxtime ="+maxtime);
        System.out.println("mintime ="+mintime);
    }
}

package puzzle;

/*
 * 蚂蚁类
 */

public class Ant {
    private String name = null;
    private int position = 0;
    private String direction = null; // left or right
    private boolean out = false; // 是否已离开要木杆

    public Ant(String n, int p, String d) {
        this.name = n;
        this.position = p;
        this.direction = d;
    }

    /*
     * 判断蚂蚁是否离开木杆
     */
    public boolean isOut() {
        if (position == 0 || position == 27) {
            out = true;
        } else {
            out = false;
        }
        return out;
    }

    /*
     * 蚂蚁的移动.向右则位置加1,向左则位置减1 如果蚂蚁已离开木杆则不会移动
     */
    public void move() {
        if (!isOut()) {
            if (direction.equals("left")) {
                position--;
            } else if (direction.equals("right")) {
                position++;
            } else {
                System.out.println("no diection found");
            }
            System.out.println("[" + name + "] at: " + position + "move to "
                    + direction);
        }else{
            System.out.println("["+name+"] is out");
        }
        
    }

    public String getDirection() {
        return direction;
    }


    public void setDirection(String direction) {
        this.direction = direction;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getPosition() {
        return position;
    }

    public void setPosition(int position) {
        this.position = position;
    }
}

评论人:forscan 发表时间: Sat Nov 18 11:23:39 CST 2006
有个问题:如果蚂蚁的初始位置有奇数和偶数那么用两只蚂蚁的位置是否相同来判断是否
碰头好象就有问题.如一只在5处向右,一只有6处向左,那么向右的加1变6,向左的减1变5,位置就也不同???????????,望指教?
评论人:gentleman 发表时间: Tue Nov 21 00:24:43 CST 2006
其实最大的距离看两边的数那个离两端的端点最远.那个就是最大的距离了
比如说 ant1,ant2,ant3,ant4,ant5
对于ant1来说它的最远距离就是s(也就27)-ant1(3)
对于ant2来说它的最远距离就是s+(ant2 - ant1+ant2/2)+ant1+ant2/2  合并一下就是s-ant2
因为ant2在大于ant1所以 
ant1就是距离最远的.
当然因为是可以两个方向的,所以就要比较两个端点的的大小了. 
评论人:简单 发表时间: Fri Dec 01 15:46:17 CST 2006
评论人:linkehong  发表时间: Thu Nov 16 13:07:33 CST 2006  
考虑到要所有的蚂蚁都爬出木竿,当两只蚂蚁相撞可以等效为两只蚂蚁互相穿透了,这个是关键点。 所以最大的就是在3厘米位置的蚂蚁爬到27,时间为24秒。  
[w]强,好想法!
评论人:mrou2001 发表时间: Wed Dec 06 22:15:01 CST 2006
不错的文章[java]

这个文章共有 24 条评论
主题: Java对各种文件的操作详解 上一篇文章
返回文章列表 返回〔J2SE综合〕
下一篇文章 主题: 文件和流


文字广告链接
        自主、快速定制基于JAVA的B/S业务系统          重量级企业在线自定义WEB报表平台
        Excel制表、零代码发布、打印、图表结合——快逸报表,免费、稳定、功能强大的java工具
        技术圈: 关于Java、dotNet、PHP、Ruby、奇客、Web2.0等更多资讯博客精选文章

关于 JR  |  版权声明  |  联系我们 

©2002-2006 JR 版权所有 沪ICP备05019622号