有一根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>i & 1); s[i].pos = InitPos[i]; } } //更新蚂蚁的位置 void UpdateState(struct State *s) { for (int i=0; i = LENGTH) continue; finish = 0; for (int j=i+1; j max_cost) { max_cost = t; max = origState; } if (t < min_cost) { min_cost = t; min = origState; } break; } } origState++; } }