白书上的题。。。。
思路好牛逼。。。。。
怎么想呢?
当你在远处看这些蚂蚁的时候你会看到的是一堆黑点的移动。
对于两支碰撞的蚂蚁,当你在远处的看的时候,会感觉他们是穿过对方,而没有变向。
比方说如果T=2 (1,R),(3,L),(4,L)三只蚂蚁
那么我们先直接求出最终状态
(3,R),(1,L),(2,L)
又因为蚂蚁实际是不能相互穿过的,那么相对位置应该没变
那么排序之后(1,L),(2,L),(3,R)就是他们最终的状态
然后类推求N只蚂蚁的时候是一样的
又因为这题输入不是有序的,那么需要一个数组来记录他们的输出顺序
AC代码如下:
#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
using namespace std;
struct Node{
int pos;
char s[5];
int o;
int statu;
};
Node node[10010], ans[10010];
int order[10010];
int L, T, N;
int cmp( const void *a, const void *b ){
if( ((Node*)a)->pos > ((Node*)b)->pos ){
return 1;
}else{
return -1;
}
}
int main(){
int TT, Case = 1;
cin >> TT;
while( TT-- ){
cin >> L >> T >> N;
for( int i = 0; i < N; i++ ){
scanf( "%d%s", &node[i].pos, node[i].s );
node[i].o = i;
}
qsort( node, N, sizeof( Node ), cmp );
for( int i = 0; i < N; i++ ) order[i] = node[i].o;
for( int i = 0; i < N; i++ ){
if( node[i].s[0] == 'L' ){
node[i].pos -= T;
}else{
node[i].pos += T;
}
}
qsort( node, N, sizeof( Node ), cmp );
for( int i = 0; i < N; i++ ){
if( node[i].pos < 0 || node[i].pos > L ){
node[i].statu = 0;
}else if( ( i > 0 && node[i].pos == node[i-1].pos ) || ( i < N - 1 && node[i].pos == node[i+1].pos ) ){
node[i].statu = 1;
}else{
node[i].statu = 2;
}
}
for( int i = 0; i < N; i++ ) ans[order[i]] = node[i];
printf( "Case #%d:\n", Case++ );
for( int i = 0 ; i < N; i++ ){
if( ans[i].statu == 0 ){
printf( "Fell off\n" );
}else if( ans[i].statu == 1 ){
printf( "%d Turning\n", ans[i].pos );
}else{
printf( "%d %s\n", ans[i].pos, ans[i].s );
}
}
cout << endl;
}
return 0;
}