学到了如何用order数组把蚂蚁的顺序按照输入的顺序输出,用order[i]表示第i个编号的蚂蚁从左到右的位置。
#include<bits/stdc++.h>
#define maxn 10005
using namespace std;
char dir[3][10]={"L","Turning","R"};
struct Ant{
int id; //编号
int p; //位置
int d; //左-1 相撞0 右1
bool operator <(const Ant &a)const{
return p<a.p;
}
}before[maxn],after[maxn];
int order[maxn];
int main(){
int k,l,t;
scanf("%d",&k);
for(int kase=1;kase<=k;kase++){
int p,d,n;
char c;
scanf("%d %d %d",&l,&t,&n);
for(int i=0;i<n;i++){
scanf("%d %c",&p,&c);
d=(c=='R')? 1:-1;
before[i]=(Ant){i,p,c};
after[i]=(Ant){0,p+t*d,d};
}
sort(before,before+n);
for(int i=0;i<n;i++)
order[before[i].id]=i; //编号为i的蚂蚁为从左数第几个
sort(after,after+n); //计算最终形态
for(int i=0;i<n-1;i++)
if(after[i].p==after[i+1].p)
after[i].d=after[i+1].d=0;
printf("Case #%d:\n",kase);
for(int i=0;i<n;i++){
int a=order[i];
if(after[a].p<0 || after[a].p>l) printf("Fell off\n");
else
printf("%d %s\n",after[a].p,dir[after[a].d+1]);
}
printf("\n");
}
}