//看了前面的鬼魂方法,不用編程甚至不用計算就得出結果
//但我是一個編程初學者,一切只是為了練習, 我花一點時間用C++做一下吧
#include <iostream>
using namespace std;
//常量設置
const int APOS=0; //A點位置
const int BPOS=27; //B點位置
const int MAXANT=5;//最大螞蟻數
const int SPEED=1; //速度
//全局變量
//初始位置已知量(必須是奇數)
int poslist[MAXANT]={3,7,11,17,23};
//用五位2進制表示5只螞蟻的開始方向 00000-11111 ,共32種
enum ANTFLAG{
ANTFLAG1 = 0x1,
ANTFLAG2 = 0x2,
ANTFLAG3 = 0x4,
ANTFLAG4 = 0x8,
ANTFLAG5 = 0x10
//ANTFLAG6 = 0X20 //假如有更多只
//...
};
int antflist[]={ANTFLAG1,ANTFLAG2,ANTFLAG3,ANTFLAG4,ANTFLAG5};
//根據2進制數求螞蟻的起開始方向
int StartDir(int val1,int val2){
int ir=(antflist[val1]&val2) ? 1:-1;
return ir;
}
class Ant;
//螞蟻類
class Ant{
private:
int m_id; //螞蟻id編號(0-4)
bool m_life; //生命狀態,初始:1離開桿后:0
int m_pos; //木桿上坐標(0-27)
int m_dir; //方向(1,-1)
int m_speed; //速度(1)
int m_time; //爬行時間(0- ?)
public:
static int count;//現有蟻數
static int antlist[MAXANT];//存儲每個螞蟻的位置
public:
Ant();
void Init();//螞蟻初始化
int GetId(){return m_id;}//獲得ID編號
int GetTime(){return m_time;}//返回時間
void SetDir(int val){ m_dir=StartDir(m_id,val);}//初始方向
void CheckLife(); //檢測生命狀態
void ChangeDir(); //相遇改變方向
void RunPos(); //每秒后的位置
void Print(){cout < < "id: " < <m_id < < " pos: " < <m_pos
< < " dir: " < < m_dir < < " time: " < <m_time < <endl;}
};//end ANT
Ant::Ant(){ m_id=count;Init();count++;}
void Ant::Init(){
m_pos=poslist[m_id];
m_speed=SPEED;
m_life=1;
m_time=0;
}
void Ant::CheckLife (){
if(m_life){
if(m_pos <APOS || m_pos> BPOS)
{
m_life=0;
count--;
}
else
m_time++;
}
}
void Ant::ChangeDir(){if(m_life){m_dir*=-1;}}
void Ant::RunPos(){
if(m_life)
m_pos+=m_dir*m_speed;
antlist[m_id]=m_pos;
}
//一個作用螞蟻類的類
class FunAnt{
public:
int lasttime; //最后一只螞蟻離開的時間
Ant ants[MAXANT]; //螞蟻對象數組共5只
public:
FunAnt(){}
//設置螞蟻初始方向
void Funsetdir(int d){
for(int i=0; i <MAXANT;i++)
ants[i].SetDir(d);
}
//屏幕輸出所有螞蟻信息
void print(){
for(int i=0;i <MAXANT;i++)
ants[i].Print();
}
//一直到最后一只螞蟻離開木桿,輸出每只螞蟻所用時間
void Run()
{
while(ants[0].count){
for(int i=0;i <MAXANT;i++)
{
ants[i].RunPos(); //移動螞蟻位置
ants[i].CheckLife();//檢測螞蟻是否在桿上
}
ChangeDir();//檢測,如果螞蟻相遇改變方向,
}
lasttime=ants[0].GetTime();
for(int i=1; i <MAXANT;i++)
{
bool b=lasttime <ants[i].GetTime();
if(b){lasttime=ants[i].GetTime();}
}
print();
}
//檢測相鄰螞蟻位置函數,如果位置相同就調用改變方向函數
void ChangeDir(){
for(int i=0;i <MAXANT-1;i++)
{
if(ants[0].antlist[i]==ants[0].antlist[i+1])
{
ants[i].ChangeDir();
ants[i+1].ChangeDir();
}
}
}
};
int Ant::antlist[]={3,7,11,17,23};
int Ant::count=0;
//////////////////////////////////////////
void main(){
int maxlist[32]; //存儲32次的結果數組
for(int i=0;i <32;i++){
Ant::count =0;
FunAnt a1;
a1.Funsetdir(i);
a1.Run();
maxlist[i]=a1.lasttime;
cout < < "lasttime: " < <a1.lasttime < <endl;
}
int min,max;
min=max=maxlist[0];
for(int i=0;i <32 ;i++)
{
if(max <maxlist[i])
max=maxlist[i];
if(min> maxlist[i])
min=maxlist[i];
}
cout < < "max: " < <max < <endl
< < "min: " < <min < <endl;
}//end main
|