這是一道非常有意思的題目,乍一看題目描述的過程非常的複雜,直接模擬怕是要出梗。
但是,仔細在紙上進行演示和推導後,把兩隻螞蟻的相撞看作是兩隻螞蟻交換穿過對方並且交換編號即可。
不說很難,但是非常有意思,所以在這裏做個記錄
代碼如下
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<iostream>
#define clear(n,m) memset(n,m,sizeof(n))
using namespace std;
struct Ant
{
int s, d, e, id;
}ant[10010];
char dir[][8] = { "L","Turning","R" };
bool cmp(Ant a, Ant b)
{
return a.s < b.s;
}
int main()
{
int N, cas = 1;
cin >> N;
while (N--)
{
int L, T, n;
cin >> L >> T >> n;
for (int i = 0;i < n;i++)
{
char dir;
ant[i].id = i;
cin >> ant[i].s >> dir;
ant[i].d = (dir == 'L' ? -1 : 1);
ant[i].e = ant[i].s + ant[i].d*T;
}
sort(ant, ant + n, cmp);
bool finish = false;
while (!finish)
{
finish = true;
for (int i = 0, j = 1;j < n;i++, j++)
{
if (ant[i].d == 1 && ant[j].d == -1 && ant[i].e>ant[j].e&&ant[i].s < ant[j].s)
{
Ant tmp = ant[i];
ant[i] = ant[j];
ant[i].id = tmp.id;
tmp.id = ant[j].id;
ant[j] = tmp;
finish = false;
}
}
}
for (int i = 0, j = 1;j < n;i++, j++)
{
if (ant[i].e == ant[j].e)
ant[i].d = ant[j].d = 0;
}
printf("Case #%d:\n", cas++);
for (int i = 0;i < n;i++)
{
for (int j = 0;j < n;j++)
{
if (ant[j].id == i)
{
if (ant[j].e<0 || ant[j].e>L)
{
cout << "Fell off" << endl;
}
else
{
cout << ant[j].e << ' ' << dir[ant[j].d + 1] << endl;
}
}
}
}
cout << endl;
}
return 0;
}