您的位置:首页 > 大数据 > 物联网

UVA-10881 蚂蚁 Piotr's Ants

2017-04-19 22:32 337 查看
题目大意:一根长L厘米的木棍上有n只蚂蚁,每只蚂蚁有个开始的位置和爬行方向,速度为1.当两只蚂蚁相撞后,两者同时掉头继续爬行,求按输入顺序给出每只蚂蚁T秒后的位置后朝向。

/*蚂蚁相遇时可以理解为“对穿而过"
关键是找到移动后,对应位置的蚂蚁是最初的哪只蚂蚁,
于是发现蚂蚁移动后的相对顺序是不变的,于是用order数组哈希定位
order[i]数组:最初顺序为i的位置,这个打表用得好
感觉用两个数组就是节约2*n的i++
*/
#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;
const int maxn=10000+5;
struct node
{
int id;//输入时的顺序
int p;//位置
int d;//方向
bool operator<(node t)const
{
return p<t.p;
}
} before[maxn],after[maxn];
int order[maxn];
const char dirName[][10]= {"L","Turning","R"};
int main(int argc,char* argv[])
{
int Case,L,T,n;
scanf("%d",&Case);
for(int k=1; k<=Case; k++)
{
char t;
int p,d;
scanf("%d%d%d",&L,&T,&n);
for(int i=0; i<n; i++)
{
scanf("%d %c",&p,&t);
d=(t=='L'?-1:1);
before[i]=(node)
{
i,p,d
};//这个构造用的好,看起来代码又简洁了一点
after[i]=(node)
{
0,p+d*T,d
};//这里的id是未知的
}
sort(before,before+n);
for(int i=0; i<n; i++)
order[before[i].id]=i;
sort(after,after+n);
for(int i=0; i<n-1; i++) //修改在碰撞中的蚂蚁方向
if(after[i].p==after[i+1].p) after[i].d=after[i+1].d=0;
printf("Case #%d:\n",k);
for(int i=0; i<n; i++)
{
int pp=order[i];
if(after[pp].p<0||after[pp].p>L) puts("Fell off");
else printf("%d %s\n",after[pp].p,dirName[after[pp].d+1]);
}
puts("");
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: