模拟思维

Piotr's Ants

https://vjudge.net/problem/UVA-10881

一道模拟题,题意实说,一根杆上有m个蚂蚁,方向不同,给你方向,问t秒之后蚂蚁的位置。

我们知道 两只蚂蚁 相遇并且转向的话,其实就相当于对穿而过,但是每只蚂蚁的固定位置是不变的,所以每只蚂蚁移动后,按照他的位置排好序,将蚂蚁原来的位置编号重新防到现在的位置上,输出就好。

代码:

#include<bits/stdc++.h>
using namespace std;

struct node{
    int x;
    char c;
    char s;
    int id;
}T[100005];
int iod[100005];
bool cmp(node a,node b){
    return a.x < b.x;
}
bool cmp2(node a,node b){
    return a.id < b.id;
}
int main()
{
    int n;
    scanf("%d",&n);
    int num = 0;
    while(n --){
        memset(iod,0,sizeof(0));
        memset(T,0,sizeof(T));
        int L,t,m;
        scanf("%d%d%d",&L,&t,&m);

        for(int i = 0; i < m; i++){//先将按位置前后排好序的蚂蚁位置编号记下来
            scanf("%d %c",&T[i].x,&T[i].c);
            T[i].id = i;
        }
        sort(T, T + m,cmp);
        for(int i = 0; i < m ;i++){
            iod[i] = T[i].id;
        }
        for(int i = 0; i < m;i++){
            if(T[i].c == 'R'){
                T[i].x += t;
                if(T[i].x > L) T[i].s = 'F';
            }
            else{
                T[i].x -= t;
                if(T[i].x < 0) T[i].s = 'F';
            }
        }
        sort(T,T + m, cmp);
        for(int i = 0; i < m - 1 ;i ++){
            if(T[i].s == 'F') continue;
            else{
                if(T[i].x == T[i + 1].x){
                    T[i].s = 'T';
                    T[i + 1].s = 'T';
                }
            }
        }

        for(int i = 0; i < m ;i ++){//将蚂蚁的位置编号重新安排上
            T[i].id = iod[i];
        }

        sort(T,T + m, cmp2);
        printf("Case #%d:\n",++num);

        for(int i = 0; i  < m; i++){
            if(T[i].s == 'F') printf("Fell off\n");
            else if(T[i].s == 'T') printf("%d Turning\n",T[i].x);
            else{
                printf("%d %c\n",T[i].x,T[i].c);
            }
        }
        printf("\n");
    }
}
 

猜你喜欢

转载自blog.csdn.net/qq_41650771/article/details/81352197