UVa 10881

来源:互联网 发布:大学生网络诈骗图片 编辑:程序博客网 时间:2024/06/02 10:40

题目:有一些蚂蚁在一根棍子上爬行,每个蚂蚁有一个初始位置和方向,如果蚂蚁相撞则掉头,

            蚂蚁的速度为1,问时间T后,各个蚂蚁的位置和方向。

分析:模拟。如果蚂蚁没有区别,那么相撞可以忽略,认为各自继续前行。

            因为有上面的结论,在考虑编号的时候,只要在运动后,按照初始的顺序给予编号即可;

            首先,计算初始时每个蚂蚁的位置顺序编号记录在id中;

            然后,无视碰撞计算每个蚂蚁的位置,计算T时刻的每个蚂蚁的位置顺序记录在order中;

            最后,按照输入顺序查询输出,用T时刻第id[i]]的蚂蚁,替换初始第i只蚂蚁的位置方向;

说明:有点绕,(⊙v⊙)。

#include <stdio.h>#include <stdlib.h>#include <string.h>int  order[10001];int  id[10001];int  now[10001];char dir[10001];int cmp(const void *a, const void *b){return now[*(int *)a] - now[*(int *)b];}int main(){int c, L, T, n;while (~scanf("%d",&c)) {for (int t = 1; t <= c; ++ t) {scanf("%d%d%d",&L,&T,&n);for (int i = 0; i < n; ++ i) {scanf("%d %c",&now[i],&dir[i]);order[i] = i;}qsort(order, n, sizeof(int), cmp);for (int i = 0; i < n; ++ i) {id[order[i]] = i;}for (int i = 0; i < n; ++ i) {order[i] = i;if (dir[i] == 'L') {now[i] -= T;}else {now[i] += T;}}qsort(order, n, sizeof(int), cmp);printf("Case #%d:\n",t);for (int i = 0; i < n; ++ i) {int index = id[i];if (now[order[index]] < 0 || now[order[index]] > L) {puts("Fell off");}else {printf("%d ",now[order[index]]);if (index > 0 && now[order[index-1]] == now[order[index]] || index < n-1 && now[order[index+1]] == now[order[index]]) {puts("Turning");}else {printf("%c\n",dir[order[index]]);}}}puts("");}}return 0;}