uva 10881 蚂蚁

#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
const int maxn=10000+10;
struct Ant
{
    int id;int pos;int dire;//  -1 左 0  转身中  1 右
    bool operator<(const Ant & p)const {
    return pos<p.pos;
    }
}before[maxn],after[maxn];
int main()
{
    int t;scanf("%d",&t);int k=0;
    while(t--){
        int L,T,n;
        scanf("%d %d %d",&L,&T,&n);
        for(int i=0;i<n;i++){
            int a; char ch;
            scanf("%d %c",&a,&ch);
            int b;
            if(ch=='L')  b=-1;else b=1;
              before[i].id=i;
              before[i].pos=a;
              before[i].dire=b;
              after[i].id=0;
              after[i].pos=a+T*b;
              after[i].dire=b;
//              before[i]=Ant{i,a,b};
//              after[i]=Ant{0,a+b*T,b};
//              struct Ant before[i]={i,a,b};
//              struct Ant after[i]={0,a+b*T,b};
        }
        int order[maxn];
        sort(before,before+n);
        for(int i=0;i<n;i++)
            order[before[i].id]=i;//这个地方很难理解  由于输入输出的顺序要相同,但是我们敲代码时要进行排序,所以要将顺序存起来
            //于是我们引进了order  用于记录当前第i个是原来输入时的第几个(after[i].id)。并引入了order。

         sort(after,after+n);
           for(int i=0;i<n-1;i++){
            if(after[i].pos==after[i+1].pos)  {after[i].dire=0;after[i+1].dire=0;}
           }//对之后的方向进行判断
           printf("Case #%d:\n",++k);
           for(int i=0;i<n;i++){
              int a=order[i];//现在的第order[i]是原来的第a个    原来的第i个是现在的第a个
              if(after[a].pos<0||after[a].pos>L)  printf("Fell off\n");
              else if(after[a].dire==-1)  printf("%d L\n",after[a].pos);
              else if(after[a].dire==0)    printf("%d Turning\n",after[a].pos);
              else if(after[a].dire==1)  printf("%d R\n",after[a].pos);
           }
           printf("\n");

    }
}
注意:如果你从i=1开始存的,一定注意判断条件也要相应的改一下,否则只能一直wa了,我就是一个活例子

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值