百度面試題-螞蟻

來源:互聯網
上載者:User

 今天師兄給了這道題我做了下:就用AS3來寫吧~我比較熟悉呵呵~~

 

有一根27厘米的細木杆,在第3厘米、7厘米、11厘米、17厘米、23厘米這五個位置上各有一隻螞蟻。 木杆很細,不能同時通過一隻螞蟻。開始 時,螞蟻的頭朝左還是朝右是任意的,它們只會朝前走或調頭, 但不會後退。當任意兩隻螞蟻碰頭時,兩隻螞蟻會同時調頭朝反方向走。假設螞蟻們每秒鐘可以走一厘米的距離。 編寫程式,求所有螞蟻都離開木杆 的最小時間和最大時間。

 

首先我們寫一個螞蟻類Ant:

package {
 import flash.events.*;
 import flash.display.MovieClip;
 public class Ant extends MovieClip {
  private var totalLength:int=27; //一共有27
  public var speedPerSecond:int=1; //移動速度
  private var initPosition:int; //初始化的位置
  public var curPosition:int; //當前位置
  public var isDone:Boolean=false; //是否走出
  public function Ant(position:int) {  //初始化
   init(position);
  }
  public function set direct(value:int):void { //set設定移動方向
   this.speedPerSecond=value;
  }
  public function get direct():int { //get或者移動方向
   return this.speedPerSecond;
  }
  public function reset():void { //重新設定螞蟻的初始位置,並設為未走出
   isDone=false;
   this.curPosition=initPosition;
  }
  private function init(position:int):void { //初始化
   this.curPosition=position;
   this.initPosition=position;
  }
  public function forword():void { //移動
   curPosition+=speedPerSecond;
   if (curPosition==0||curPosition==totalLength) { //如果為0或者27則為走出了
    isDone=true; //設定已走出
   }
  }
 }
}

 

 

然後我們寫一個控制螞蟻移動的控制類:

package {
 import flash.display.Sprite;
 import flash.events.*;
 public class Controler extends Sprite {
  private var AntGroup:Array=new Array(); //存放螞蟻
  private var PositionGroup:Array=new Array(); //存放32種移動方法,如:00100
  private var totalPositions:int; //記錄一共多少種移動方法
  private var curPosition:int=0; //當前是第幾個移動方法
  private var curPositionStr:String; //當前移動方法的具體,如:00100
  private var usedFrame:int=0; //花了多少幀
  private var isDoneNums:int=0; //記錄完成數目
  public function Controler(amount:int) { //初始化一共多少螞蟻
   totalPositions=Math.pow(2,amount); //2的amount次方,這裡是2的5次方,即32
   addAnts(); //添加螞蟻
   addPositions(amount); //添加不同的具體位置進去
  }
  private function addAnts():void {
   AntGroup.push(new Ant(3),new Ant(7),new Ant(11),new Ant(17),new Ant(23)); //5隻不同位置的螞蟻
  }
  private function addPositions(amount:int):void { //添加不同的位置,這裡有32種
   for (var i:int=0; i<totalPositions; i++) {
    var str:String=i.toString(2); //0轉化成2進位為0
    var temp:int=5-str.length; //存放要在前頭加幾個0
    for (var k:int=0; k<temp; k++) {
     str="0"+str; //添加前頭的0
    }
    PositionGroup.push(str); //加入到數組中
   }
  }
  public function run():void { //運行
   nextPosition(); //下一個具體移動方法
   addEventListener(Event.ENTER_FRAME,moving); //添加事件偵聽
  }
  private function nextPosition():void { //下一個移動方法
   for (var i:int=0; i<5; i++) {
    var temp:int=parseInt(PositionGroup[curPosition].charAt(i)); //如果為1,則不做,向右走
    if (temp==0) { //如果為0,則為-1,向左走
     temp=-1;
    }
    AntGroup[i].direct=temp; //設定每個螞蟻的移動方向
   }
  }
  private function testHit():void{ //測試相遇
   for(var i:int=0;i<5;i++){
    switch(i){
     case 0:
      if(AntGroup[i].curPosition==AntGroup[i+1].curPosition){ //第一個和第二個
       AntGroup[i].speedPerSecond*=-1;
       AntGroup[i+1].speedPerSecond*=-1;
      }
      break;
     case 4:
      if(AntGroup[i].curPosition==AntGroup[i-1].curPosition){ //最後一個和倒數第二個
       AntGroup[i].speedPerSecond*=-1;
       AntGroup[i-1].speedPerSecond*=-1;
      }
      break;
     default:
      if(AntGroup[i].curPosition==AntGroup[i+1].curPosition){ //中間的相遇
       AntGroup[i].speedPerSecond*=-1;
       AntGroup[i+1].speedPerSecond*=-1;
      }
      if(AntGroup[i].curPosition==AntGroup[i-1].curPosition){
       AntGroup[i].speedPerSecond*=-1;
       AntGroup[i-1].speedPerSecond*=-1;
      }
      break;
      
    }
   }
  }
  private function moving(event:Event):void { //移動
   usedFrame++; //每幀加一
   for (var i:int=0; i<5; i++) {
    if (AntGroup[i].isDone) { //如果已經走出,則跳過
     continue;
    } else {
     AntGroup[i].forword(); //否則移動
    }
    if (AntGroup[i].isDone) { //移動後走出了,則給完成數加1.
     isDoneNums++;
    }
   }
   testHit(); //測試相遇
   if (isDoneNums==5) { //如果完成數為5,則全部走出來了
    trace(PositionGroup[curPosition]+":use frames"+usedFrame); //輸出具體移動方法和所用時間
    curPosition++; //到下一個具體移動方法
    usedFrame=0; //設定所用時間為0
    isDoneNums=0; //設定完成數為0
    if (curPosition==totalPositions) { //如果當前移動為最後一個,則全部移動方法都嘗試了
     trace("All done!"); //輸出移動
     removeEventListener(Event.ENTER_FRAME,moving); //移除偵聽
    } else {
     resetAnts(); //否則重新設定螞蟻
     nextPosition(); //設定下一個具體移動方法
    }
   }
  }
  private function resetAnts():void { //重新設定螞蟻
   for (var i:int=0; i<5; i++) {
    AntGroup[i].reset(); //每個螞蟻重新設定
   }
  }
 }
}

在main.fla上面建立Controler執行個體:

var controler:Controler=new Controler(5); //建立5個點
controler.run(); //開始運作

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.