#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
const int maxn=10000+10;
struct Ant
{
int id;int pos;int dire;// -1 左 0 转身中 1 右
bool operator<(const Ant & p)const {
return pos<p.pos;
}
}before[maxn],after[maxn];
int main()
{
int t;scanf("%d",&t);int k=0;
while(t--){
int L,T,n;
scanf("%d %d %d",&L,&T,&n);
for(int i=0;i<n;i++){
int a; char ch;
scanf("%d %c",&a,&ch);
int b;
if(ch=='L') b=-1;else b=1;
before[i].id=i;
before[i].pos=a;
before[i].dire=b;
after[i].id=0;
after[i].pos=a+T*b;
after[i].dire=b;
// before[i]=Ant{i,a,b};
// after[i]=Ant{0,a+b*T,b};
// struct Ant before[i]={i,a,b};
// struct Ant after[i]={0,a+b*T,b};
}
int order[maxn];
sort(before,before+n);
for(int i=0;i<n;i++)
order[before[i].id]=i;//这个地方很难理解 由于输入输出的顺序要相同,但是我们敲代码时要进行排序,所以要将顺序存起来
//于是我们引进了order 用于记录当前第i个是原来输入时的第几个(after[i].id)。并引入了order。
sort(after,after+n);
for(int i=0;i<n-1;i++){
if(after[i].pos==after[i+1].pos) {after[i].dire=0;after[i+1].dire=0;}
}//对之后的方向进行判断
printf("Case #%d:\n",++k);
for(int i=0;i<n;i++){
int a=order[i];//现在的第order[i]是原来的第a个 原来的第i个是现在的第a个
if(after[a].pos<0||after[a].pos>L) printf("Fell off\n");
else if(after[a].dire==-1) printf("%d L\n",after[a].pos);
else if(after[a].dire==0) printf("%d Turning\n",after[a].pos);
else if(after[a].dire==1) printf("%d R\n",after[a].pos);
}
printf("\n");
}
}
注意:如果你从i=1开始存的,一定注意判断条件也要相应的改一下,否则只能一直wa了,我就是一个活例子
uva 10881 蚂蚁
最新推荐文章于 2019-04-18 10:02:00 发布