题目链接:
题意:有很多只蚂蚁在一条直线上,每个蚂蚁移动速度都是1,并且有一个初始方向。并且当相邻两个蚂蚁相撞时转向。现在问t时间后各个蚂蚁的位置。
解法:这题的一个致命技巧就是把两只蚂蚁的相撞看作是两只蚂蚁交换穿过对方并且交换蚂蚁的编号。这个是很好理解的,类似于物理的完全弹性碰撞。又由于任何两只蚂蚁的相对位置在这种转弯的情况下不会改变相对位置,因此我们只要视作所有蚂蚁没有蚂蚁的行动。最后根据位置关系对应到原始的位置关系。最后再做位置判断的时候查看是否超出坐标之外即可。
下面给出AC代码:
1 #include2 using namespace std; 3 const int maxn=10000+5; 4 struct Ant 5 { 6 int id;//顺序 7 int p;//位置 8 int d;//转向,-1表示左,0表示碰撞中,1表示右 9 bool operator <(const Ant& a)const10 {11 return p L)48 printf("Fell off\n");49 else printf("%d %s\n",after[a].p, dirName[after[a].d+1]);50 }51 printf("\n");52 }53 return 0;54 }