10881 - Piotr's Ants 趣味模拟题

来源:互联网 发布:特斯拉电磁塔升级数据 编辑:程序博客网 时间:2024/06/08 16:30

/*
 * 模拟题:挺有意思的。
 * 看似有些麻烦,因为貌似是动态的对各蚂蚁的方向要调整,
 * 其实没必要的,两只蚂蚁碰撞,按题意是需要改变方向的,但其实可以看成直接互穿,
 * 也就是两只蚂蚁直接穿过对方,继续前进,这样想只是为了方便计算所有蚂蚁最后的位置。
 * 但注意!! 并不是原来的蚂蚁! 也就是说,编号变了! 比如A 和 B 在点O碰撞,
 * 之后又各自行进了3cm,最后在O - 3 和 O + 3都有只蚂蚁,但是,实际上,O - 3是A,而一开始看成穿越式的话,A便不再O - 3上了
 * 也就是说,在你计算完所有蚂蚁所在的位置之后,还要计算各蚂蚁对应的位置,因为题目要求按照蚂蚁的输入顺序,输出最后位置。
 * 这样就可以先在输入的时候对各蚂蚁进行编号NO1 2 3...
 * 这里还有一点就是,无论怎么碰撞,若对一开始输入的蚂蚁的位置进行排序,最终的位置是不变的,
 * 也就是说,因为实际上碰撞后发生了转向而不是穿越,所以顺序是不变的。 比如一开始位置顺序(不是编号顺序)是A B C D四只蚂蚁,那么最后计算出来的位置也就是按照这样的顺序的蚂蚁分布。
 * 所以,步骤: (1) 对所有蚂蚁按照位置pos排序;
                (2) 计算出最后所在位置;
                (3) 在根据位置顺序一一对应;
                (4) 再根据 编号NO进行排序;
                (5) 最后输出。
 */
#include <cstdio>
#include <algorithm>
using namespace std;
struct Ant {
    int pos, NO;
    char dir;
} ants[10000], finalAnts[10000];

int cmp1(const Ant &a, const Ant &b)
{
    return a.pos < b.pos;
}
int cmp2(const Ant &a, const Ant &b)
{
    return a.NO < b.NO;
}

int main()
{
    int cases, L, T, n;
    scanf("%d", &cases);
    for(int curCase = 1; curCase <= cases; curCase ++) {
        int i;
        scanf("%d%d%d", &L, &T, &n);
        for(i = 0; i < n; i ++) {
            scanf("%d %c", &ants[i].pos, &ants[i].dir);
            ants[i].NO = i + 1;
        }
        for(i = 0; i < n; i ++) {
            finalAnts[i].dir = ants[i].dir;
            if(ants[i].dir == 'R')
                finalAnts[i].pos = ants[i].pos + T;
            else
                finalAnts[i].pos = ants[i].pos - T;
        }
        sort(ants, ants + n, cmp1);
        sort(finalAnts, finalAnts + n, cmp1);
        for(i = 0; i < n; i ++) {
            ants[i].pos = finalAnts[i].pos;
            ants[i].dir = finalAnts[i].dir;
            if(ants[i].pos == ants[i - 1].pos) {
                ants[i].dir = 'T';
                ants[i - 1].dir = 'T';
            }
        }
        sort(ants, ants + n, cmp2);
        printf("Case #%d:\n", curCase);
        for(i = 0; i < n; i ++) {
            if(ants[i].pos < 0 || ants[i].pos > L)
                printf("Fell off\n");
            else if(ants[i].dir == 'T')
                printf("%d Turning\n", ants[i].pos);
            else if(ants[i].dir == 'R')
                printf("%d R\n", ants[i].pos);
            else
                printf("%d L\n", ants[i].pos);
        }
        printf("\n");
    }
    return 0;
}

原创粉丝点击