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 顺序输出即可。
解题思路:首先理解以下两点:
题目说两只蚂蚁相碰后会掉头,可以说明蚂蚁的相对位置是不会改变的,即从左到右的顺序不会变。如 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; }
相关文章推荐
- 1.10055 - Hashmat the brave warrior
- 2.10071 - Back to High School Physics
- 3.458 - The Decoder
- 4.694 - The Collatz Sequence
- 6.494 - Kindergarten Counting Game
- 7.490 - Rotating Sentences
- 8.414 - Machined Surfaces
- 9.488 - Triangle Wave
- A.457 - Linear Cellular Automata
- B.489 - Hangman Judge
- C.445 - Marvelous Mazes
- 1.10494 - If We Were a Child Again
- 2.424 - Integer Inquiry
- 3.10250 - The Other Two Trees
- 5.465 - Overflow
- 6.113 - Power of Cryptography
- 7.10161 - Ant on a Chessboard
- 8.621 - Secret Research
- 9.401 - Palindromes
- A.537 - Artificial Intelligence?