题目求蚂蚁在经过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; }