//看了前面的鬼魂方法,不用编程甚至不用计算就得出结果
//但我是一个编程初学者,一切只是为了练习, 我花一点时间用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
|