这是一个等效变换问题,感觉解法还是蛮叼的。
应注意记录输入次序;
在按照Pos从大到小排序后,用一个数组存储输入次序;
在对Pos进行T的+/-后,重新按照Pos排序并将存储的输入次序附回原位(结构体中的位置)——以此表示变换后的该位置的结构体依然是第一次排序后的对象)
最后按输入次序输入。
#include <iostream>
using namespace std;
#include <cstdlib>
typedef struct insect
{int inputord;int pos;char str;
}INS;
int cmp1(const void*a,const void*b)
{INS x=*(INS*)a;INS y=*(INS*)b;return x.pos-y.pos;
}
int cmp2(const void*a,const void*b)
{INS x=*(INS*)a;INS y=*(INS*)b;return x.inputord-y.inputord;
}
INS ants[10050];
int order[10050];
int main()
{int L,T,n,i;int m;cin>>m;for(i=0;i<m;i++){int j;cin>>L>>T>>n;for(j=0;j<n;j++){ants[j].inputord=j;cin>>ants[j].pos>>ants[j].str;}qsort(ants,n,sizeof(INS),cmp1);for(j=0;j<n;j++){order[j]=ants[j].inputord;if (ants[j].str=='R')ants[j].pos+=T;else if (ants[j].str=='L')ants[j].pos-=T;}qsort(ants,n,sizeof(INS),cmp1);for(j=0;j<n;j++){ants[j].inputord=order[j];if(ants[j].pos==ants[j+1].pos&&j<n-1){ants[j].str='T';ants[j+1].str='T';}}qsort(ants,n,sizeof(INS),cmp2);cout<<"Case #"<<i+1<<":"<<endl;for(j=0;j<n;j++){if(ants[j].pos>L||ants[j].pos<0)cout<<"Fell off"<<endl;else{if(ants[j].str=='T')cout<<ants[j].pos<<" Turning"<<endl;elsecout<<ants[j].pos<<' '<<ants[j].str<<endl;}}cout<<endl;}return 0;
}