题目地址:http://vjudge.net/problem/UVA-10881
思路来自刘汝佳
从远远地看,蚂蚁掉头可以看成蚂蚁互相穿过,没有回头
所以把蚂蚁看成没有意义的小点,那么所有蚂蚁的位置都能确定了
还要知道哪一只蚂蚁是哪一只:
因为蚂蚁的相对位置是不变的,所以可以根据一开始的顺序判断位置变了之后的蚂蚁的序号
至于之后蚂蚁的方向同上述方法一样
流程:
1 走之前 蚂蚁位置从小到大排序,记下蚂蚁的顺序(该蚂蚁的序号就是结果蚂蚁的序号)
2计算T s后的蚂蚁的位置
3排序走之后蚂蚁的序号,此时蚂蚁的序号就是一开始蚂蚁的序号
4处理结果,因为是要按照input顺序
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
const int maxn=10000+5;
struct Ant
{
int p,t,idx; //position,toward,idx
bool operator < (const Ant& ant) const {
return p>ant.p;
}
}before[maxn],after[maxn];
int order[maxn];
const char dir[][11]={"L","Turning","R"};
int main(int argc, char const *argv[])
{
int N,kase=0,p,n,T,L; char t;
cin>>N;
while(N--){
cin>>L>>T>>n;
for(int i=0;i<n;i++){
scanf("%d %c",&p,&t);
before[i]=Ant{p,t=='R'?1:-1,i};
after[i]=Ant{p+(t=='R'?1:-1)*T,t=='R'?1:-1,0};
}
sort(before,before+n);
for(int i=0;i<n;i++)
order[before[i].idx]=i;
sort(after,after+n);
for(int i=0;i<n-1;i++)
if(after[i].p==after[i+1].p) after[i].t=after[i+1].t=0;
printf("Case #%d:\n", ++kase);
for(int i=0;i<n;i++){
int d=order[i];
if(after[d].p>L||after[d].p<0) printf("Fell off\n");
else printf("%d %s\n", after[d].p,dir[after[d].t+1]);
}
cout<<endl;
}
return 0;
}