题目大意:有一群小蚂蚁,给你他们的初始位置和方向,让你计算T时间后小蚂蚁们所在的位置,有可能会掉下去,因为木棍长度有限
其中注意:如果蚂蚁相遇,就会掉头朝相反的方向走去
解题思路:两只相遇的蚂蚁可以看做互换序号然后继续穿过行走,当然需要注意最后输出的时候要按照输入的顺序, order数组是精华!!!
代码:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int L, T, n;
int order[10010];
char d[3][10] = {"L", "Turning", "R"};
class Node
{
public:
int p, tow, id;
Node() : p(0), tow(0), id(0) {}
Node(int pp, int tt): p(pp), tow(tt), id(0) {}
};
bool cmp(Node n1, Node n2)
{
if(n1.p < n2.p)
return true;
else
return false;
}
int main()
{
int t;
scanf("%d", &t);
Node be[10010], en[10010];
for(int kase = 1; kase <= t; kase++)
{
memset(order, 0, sizeof(order));
scanf("%d %d %d", &L, &T, &n);
for(int i = 0; i < n; i++)
{
char ch;
cin >> be[i].p >> ch;
be[i].id = i; be[i].tow = (ch == 'L' ? -1 : 1);
en[i].p = be[i].p + (be[i].tow * T);
en[i].id = 0; en[i].tow = be[i].tow;
}
sort(be, be+n, cmp);
for(int i = 0; i < n; i++)
{
order[be[i].id] = i; //在输入顺序和蚂蚁编号之间建立一个映射
}
sort(en, en+n, cmp);
for(int i = 0; i < n-1; i++)
if(en[i].p == en[i+1].p)
en[i].tow = en[i+1].tow = 0;
printf("Case #%d:\n", kase);
for(int i = 0; i < n; i++)
{
int a = order[i];
if(en[a].p >= 0 && en[a].p <= L)
printf("%d %s\n", en[a].p, d[en[a].tow+1]);
else
printf("Fell off\n");
}
printf("\n");
}
return 0;
}