蚂蚁爬杆

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

分析:根据题意,初始状态就决定了最终的时间。所以只要遍历所有可能的初始状态就能找出最大最小时间。
每只蚂蚁的初始状态由方向、位置决定,这里位置固定了,所以只考虑可能的方向。只有两个可能的方向,所以初始
状态数为2^n(n蚂蚁的数量)
碰头的检查:这里每ms更新一次蚂蚁的状态,如果要求精度更高,可以更短的时间更新状态。每更新一次,做一次
检查,如果两只蚂蚁的位置相同,那么就发生碰头。

#define CNT 5
#define LENGTH 27


char min, max;
float min_cost = INT_MAX, max_cost = INT_MIN;
enum {
left=0,
right
};
float speed = 0.001; // ms

struct State{
char dir;
float pos; //杆长27cm
};

int InitPos[5]={3, 7, 11, 17, 23};
void InitState(struct State *s, char origState)
{
for (int i=0; i<CNT; i++)
{
s[i].dir = (origState>>i & 1);
s[i].pos = InitPos[i];
}
}
//更新蚂蚁的位置
void UpdateState(struct State *s)
{
for (int i=0; i<CNT; i++)
{
if (s[i].dir==left)
s[i].pos -= speed;
else
s[i].pos += speed;
}
}

//检查是否碰头
int CheckState(struct State *s)
{
int finish = 1;
float dis;
for (int i=0; i<CNT; i++)
{
if (s[i].pos <= 0 || s[i].pos >= LENGTH)
continue;
finish = 0;
for (int j=i+1; j<CNT; j++)
{
dis = s[i].pos - s[j].pos;
if (dis < 0)
dis = ((-1.0)*dis);
if ( dis <= speed )
{
//printf("collision!\n");
s[i].dir ^= 1;
s[j].dir ^= 1;
}
}
}
return finish;
}
void Search()
{
char origState=0;
struct State curState[CNT];
float t;
while (origState<pow(2, CNT))
{
InitState(curState, origState);
t=0;
//1ms为单位更新
while (1)
{
t+=0.001;
UpdateState(curState);
if (CheckState(curState) == 1)
{
printf("%f\n", t);
if (t > max_cost)
{
max_cost = t;
max = origState;
}
if (t < min_cost)
{
min_cost = t;
min = origState;
}
break;
}
}
origState++;
}
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值