题目大意:第一个数据代表数据组数,接下来三个数据 L T n ,分别代表棍长,时长以及蚂蚁数量,接下来n行是蚂蚁的初始位置以及初始方向。要求求出经过T秒后,各蚂蚁的状况。(相对棍子左端的距离,方向)蚂蚁相撞后会各自回头。若经过T秒后,两蚂蚁处于相同位置,则输出“该位置 + Turning”,若已离开木棍(刚好在木棍两端不算)输出“Fell off”,否则输出当前蚂蚁的状态。
这道题是一道逻辑的映射题,可以将蚂蚁看成对穿而过。他们的相对位置是不变的如图:0是转向中,1是向右-1是向左
附上ac代码:
# include <iostream>
# include <cstdlib>
# include <cstring>
# include <algorithm>
# include <cstdio>
using namespace std;
const int maxn = 10005;
struct node
{
int id;//输入顺序
int pos;//位置
int dis;//方向: -1L,0转向,1R
}before[maxn], after[maxn];
bool cmp(struct node a, struct node b)
{
return a.pos < b.pos;
}
int vis[maxn];
int main(int argc, char *argv[])
{
int cas;
while(cin >> cas)
{
for(int k = 1; k <= cas; k++)
{
printf("Case #%d:\n", k);
int l, t, n;
cin >> l >> t >> n;
memset(vis, false, sizeof(vis));
for(int i = 0; i < n; i++)
{
char c;
int x;
cin >> x >> c;
before[i].pos = x;
before[i].id = i;
//右是1左是0
int d = c == 'L' ? -1 : 1;
before[i].dis = d;
after[i].id = 0;
after[i].pos = x + t * d;//之后的位置
after[i].dis = d;
}
sort(before, before + n,cmp);
//记录相对顺序
for(int i = 0; i < n; i++)//将状态记录
{
vis[before[i].id] = i;
}
//计算终态
sort(after , after + n,cmp);
//修改蚂蚁碰撞后的状态
for(int i = 0; i < n - 1; i++)
{
if(after[i]. pos == after[i + 1].pos)
{
after[i].dis = after[i + 1].dis = 0;//表示转向中
}
}
/* cout << "---" << endl;
for(int i = 0; i < n; i++)
{
cout << before[i].pos << "->" << vis[i] << " -->" << after[vis[i]].pos << endl;
}
// cout << "----" << endl;
for(int i = 0; i < n; i++)
{
cout << after[i].pos << " " << after[i].dis << endl;
}
*/
// cout << "----" << endl;
for(int i = 0; i < n; i++)
{
int a = vis[i];
if(after[a].pos < 0 || after[a].pos > l)
{
cout << "Fell off" << endl; //出界
}
else if(after[a].dis == 0)
{
cout << after[a].pos << " Turning" << endl;
}
else if( after[a].dis == -1)
{
cout << after[a].pos << " L" << endl;
}
else if(after[a].dis == 1)
{
cout << after[a].pos << " R" << endl;
}
}
cout << endl;
}
}
return 0;
}