注意:蚂蚁相撞后两者反方向移动相当于蚂蚁穿墙而过,所以不用判定撞击,在这种情况下,蚂蚁的相对位置不变,即一开始位于第一位的蚂蚁最后行走后还是第一位,因为蚂蚁之间不会越位,
#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;}