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

UVA10881 Piotr's Ants

2013-08-09 15:18 369 查看
题目链接:http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&category=&problem=1822&mosmsg=Submission+received+with+ID+12182780

题目大意:一根长度为L的木棍上,有n只蚂蚁,每只蚂蚁要么向左爬要么向右爬,速度为1cm/s;当两只蚂蚁相撞时,同时回头,给出每只蚂蚁的初始位置和朝向,求经过T秒后每只蚂蚁的位置。

题目思路:(1)确定木棍上所有蚂蚁的最终位置时,两只蚂蚁相撞调头和对穿而过没有区别

 (2)将蚂蚁相撞看成对穿而过打乱了相应编号蚂蚁的位置,但蚂蚁的初始位置排列好后,最终移动后的位置也是相同的顺序的。由此特点,我们可以用结构体记录信息,经过排序后确定最终所有蚂蚁的精确位置。

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define MAX 10010
typedef struct node
{
int x,w,flag;
}node;
node map[MAX];
char s[4][10]={"Turning","L","R"};
int a[MAX];
int cmp(const void *a,const void *b)
{
node *aa=(node *)a;
node *bb=(node *)b;
return aa->w - bb->w;
}
int main()
{
int t,T,L,n,k;
scanf("%d",&t);
for (k=1;k<=t;k++)
{
int i,j;
char c;
scanf("%d%d%d",&L,&T,&n);
//memset(map,-1,sizeof(map));
for (i=0;i<n;i++)
{
scanf("%d %c",&map[i].w,&c);
map[i].x=i;
if (c=='L')
{
map[i].flag=1;
}
else if (c=='R')
{
map[i].flag=2;
}
}
//system("pause");
qsort(map,n,sizeof(node),cmp);
for (i=0;i<n;i++)
{
a[map[i].x]=i;
if (map[i].flag==1)
{
map[i].w-=T;
}
else
{
map[i].w+=T;
}
}
//system("pause");
qsort(map,n,sizeof(node),cmp);
for (i=0;i<n-1;i++)
{
if (map[i].w==map[i+1].w)
{
map[i].flag=map[i+1].flag=0;
//i++;
}
}
//system("pause");
printf("Case #%d:\n",k);
for (i=0;i<n;i++)
{
int x=a[i];
if (map[x].w>L||map[x].w<0)
{
printf("Fell off\n");
}
else
{
printf("%d %s\n",map[x].w,s[map[x].flag]);
}
}
printf("\n");
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  uva10881