UVA10881 Piotr's Ants

题目链接: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;
}


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值