您的位置:首页 > 大数据 > 物联网

UVA - 10881 Piotr's Ants

2016-08-21 22:55 323 查看
题目大意:长 L 的绳子上有 n 只蚂蚁,给出它们的初始位置和方向,移动 T 秒,两只蚂蚁相碰后会掉头,问经过 T 秒后每只蚂蚁的位置和方向,掉下绳子输出 Fell off,如果有两只在同一个位置时输出 Turning 代替方向。

解题思路:首先理解以下两点:

题目说两只蚂蚁相碰后会掉头,可以说明蚂蚁的相对位置是不会改变的,即从左到右的顺序不会变。如 2 号初始在 1 号左边,想要到 1 号右边就要穿过它,但题目说了是不会穿过只会掉头的,所以无论怎么移动,2 号始终在 1 号左边。

然后就是移动问题了,模拟两只蚂蚁相碰的情况,我们先不考虑编号问题,假设所有蚂蚁都是相同的,那么会发现无论是掉头还是穿过,蚂蚁的状态是一样的。如有一只蚂蚁初始 1 R,另一只3 L,移动一秒后,一只 2 R,一只 2 L,下一秒,两只蚂蚁掉头,一只 1 L,一只 3 R。如果是穿过呢?1 R 这只蚂蚁向右移动两秒,来到了 3 R,3 L 这只移动两秒来到 1 L,会发现最终状态也是一只 1 L 一只 3 L。所以在计算位置的时候,我们大可不必去考虑相碰的问题,直接 R 加 L 减去相应秒数

用一个 order 数组记录从左到右的蚂蚁的编号。移动完毕后对所有位置进行排序,输出时按照 order 顺序输出即可。

#include<iostream>
#include<cstdio>
#include<cmath>
#include<string.h>
#include<stdlib.h>
#include<algorithm>
using namespace std;
struct point {
int pos;
char dic;
};
point p[10010];
int order[10010];
int tmp[10010];
bool cmp(point a, point b) {
return a.pos < b.pos;
}
int main() {
int N;
scanf("%d", &N);
for (int C = 1; C <= N; C++) {
int L, T , n;
scanf("%d%d%d", &L, &T, &n);
for (int i = 0; i < n; i++) {
scanf("%d %c", &p[i].pos, &p[i].dic);
tmp[i] = p[i].pos;
}
sort(p, p+n, cmp);
for (int i = 0; i < n; i++)
for (int j = 0; j < n; j++)
if (tmp[i] == p[j].pos)
order[i] = j;

for (int i = 0; i < n; i++)
if (p[i].dic == 'R') p[i].pos += T;
else if (p[i].dic == 'L') p[i].pos -= T;

sort(p, p+n, cmp);
printf("Case #%d:\n", C);
int pos = 0, t;
for (int i = 0; i < n; i++) {
t = 0;
pos = p[order[i]].pos;
if (pos < 0  || pos > L) {
printf("Fell off\n");
continue;
}
for (int j = 0; j < n; j++)
if (order[i] == j) continue;
else if (pos == p[j].pos) t = 1;
printf("%d ", pos);
if (t) printf("Turning\n");
else printf("%c\n", p[order[i]].dic);
}
printf("\n");
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  uva ants