今天師兄給了這道題我做了下:就用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(); //開始運作