题目求蚂蚁在经过t时间移动后的位置,要求按输入顺序输出。
其实蚂蚁碰撞反向的问题可以直接“穿过”,因为蚂蚁移动过程中其相对位置是不会改变的,所以可以当作穿过。
只是在处理移动前,需要对蚂蚁所在位置进行排序,并记录当前蚂蚁从左到右的编号(输入顺序),在移动过程结束后再将其进行从小到大排序,然后赋值为刚记录的顺序。
最后再以编号排序输出即可。
T_T我排了3次序。
代码:
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define MAX 10001
using namespace std;
int l,t,n;
struct Ants
{
int pos;
int p;
int num;
int ans;
}a[MAX];
bool cmp(Ants a,Ants b)
{
return a.pos<b.pos;
}
bool cmpa(Ants a,Ants b)
{
return a.num<b.num;
}
int order[MAX];
int main()
{
int cas,cass=1;
scanf("%d",&cas);
while(cas--)
{
printf("Case #%d:\n",cass++);
scanf("%d%d%d",&l,&t,&n);
for(int i=0;i<n;i++)
{
char itb[5];
scanf("%d%s",&a[i].pos,&itb);
a[i].p=itb[0]=='L'?1:2;
a[i].num=i+1;
}
sort(a,a+n,cmp);
for(int i=0;i<n;i++)
{
order[i]=a[i].num;
a[i].pos+=a[i].p==1?-t:t;
}
sort(a,a+n,cmp);
for(int i=0;i<n;i++)
{
a[i].num=order[i];
if(a[i].pos<0||a[i].pos>l)
a[i].ans=-1;
else if(i>0&&a[i].pos==a[i-1].pos||i<n-1&&a[i].pos==a[i+1].pos)
a[i].ans=1;
else
a[i].ans=0;
}
sort(a,a+n,cmpa);
for(int i=0;i<n;i++)
{
if(a[i].ans==-1)
printf("Fell off\n");
else if(a[i].ans==1)
printf("%d Turning\n",a[i].pos);
else
printf("%d %c\n",a[i].pos,a[i].p==1?'L':'R');
}
printf("\n");
}
return 0;
}