注意:蚂蚁相撞后两者反方向移动相当于蚂蚁穿墙而过,所以不用判定撞击,在这种情况下,蚂蚁的相对位置不变,即一开始位于第一位的蚂蚁最后行走后还是第一位,因为蚂蚁之间不会越位,
#include <stdio.h> #include <iostream> #include <string> #include <cmath> #include <algorithm> #define maxn 10005 using namespace std; struct mmyi { int position;//位置 string tou;//方向 int order;//输入顺序 };mmyi a[maxn],c[maxn]; int l,t,m; bool compare(mmyi a,mmyi b){//比较函数 if(a.position<b.position)return true; else return false; } void go(){//走t步 for(int i=0;i<m;i++){ mmyi *b=&a[i]; if(b->tou=="R"){ b->position+=t; }else{ b->position-=t; } } } int main(){ int n; cin>>n; for(int i=0;i<n;i++){ cin>>l>>t>>m; for(int i=0;i<m;i++){ cin>>a[i].position>>a[i].tou; a[i].order=i; } sort(a,a+m,compare);//按照位置排序 int b[m]; for(int i=0;i<m;i++){ b[i]=a[i].order;//将终态时对应位置为哪个输入 } go(); sort(a,a+m,compare);//终态 for(int i=0;i<m;i++){ int aa=b[i]; c[aa].position=a[i].position;//对应输入的终态保存在c数组中 if(i<m-1) if(a[i].position==a[i+1].position)a[i].tou=a[i+1].tou="Turning"; if(a[i].position<0||a[i].position>l)a[i].tou="Fell off"; c[aa].tou=a[i].tou; } cout<<"Case #"<<i+1<<":"<<endl; for(int i=0;i<m;i++){ if(c[i].tou!="Fell off") cout<<c[i].position<<" "<<c[i].tou<<endl; else cout<<"Fell off"<<endl; } cout<<endl; } return 0;}