UVa 10881 Piotr's Ants (排序)

本文针对UVa10881Piotr's Ants问题提供了解决方案,通过分析蚂蚁在木棍上的移动规律,采用排序策略解决了碰撞后的方向问题,并给出了完整的代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

UVa 10881 Piotr’s Ants

题目大意:

在L长的木棍上有n只蚂蚁,向左或右爬,速度为1单位长度每秒,若两蚂蚁撞上,则掉头,求T秒以后各蚂蚁所在位置,若掉下去,输出”Fell off”,否则输出位置和朝向,若此时正撞上,朝向输出”Turning”.

题目分析:

这道题还是有一些思维含量的.实际上,n只蚂蚁在爬行过程中,其相对位置(也就是第几号位置)是不会改变的,所以可以不考虑对撞之后换方向的问题,直接理解为对穿过去.那么实际问题就只有相对位置了,排序就可以解决了.

代码:

#include<cstdio>
#include<iostream>
#include<algorithm>

using namespace std;

const int maxn=10000+10;
const char dirname[][10]={"L","Turning","R"};//便于朝向输出

struct Ant {
    int id,dir,pos;//id表示输入编号,dir表示朝向 -1->L,1->R,0->Turning,pos表示位置
    Ant(){id=dir=pos=0;}
    Ant(int id,int dir,int pos):id(id),dir(dir),pos(pos){}
    bool operator < (const Ant& rhs) const {
        return pos<rhs.pos;
    }
    void input(int x) {
        char ch;
        scanf("%d %c",&pos,&ch);
        dir=(ch=='L'?-1:1);id=x;
    }
}bef[maxn],aft[maxn];//爬行前后

int order[maxn];//相对位置

int main()
{
    int T,kase=0;
    scanf("%d",&T);
    while(T--) {
        int L,t,n;
        scanf("%d%d%d",&L,&t,&n);
        for(int i=0;i<n;i++) {
            bef[i].input(i);
            aft[i]=Ant(0,bef[i].dir,bef[i].pos+bef[i].dir*t);//之后位置相对位置编号未知,朝向不变
        }
        sort(bef,bef+n);
        for(int i=0;i<n;i++) order[bef[i].id]=i;
        sort(aft,aft+n);
        for(int i=1;i<n;i++) if(aft[i].pos==aft[i-1].pos) aft[i].dir=aft[i-1].dir=0;//考虑是否处于对撞状态
        printf("Case #%d:\n",++kase);
        for(int i=0;i<n;i++) {
            int a=order[i];
            if(aft[a].pos<0||aft[a].pos>L) printf("Fell off\n");//是否掉出木棍
            else printf("%d %s\n",aft[a].pos,dirname[aft[a].dir+1]);
        }
        printf("\n");
    }
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值