您的位置:首页 > 大数据 > 物联网

uva_10881_Piotr's Ants (模拟,Sort)

2013-04-09 15:23 393 查看
题意:
給出木條長度,螞蟻開始在木條的位置和其行走的方向,如果兩個螞蟻碰撞的時候,他們會反向走,求T秒後每個螞蟻的位置
分析:
這個題目如果模擬的話你會感到比較複雜,但是自己在紙上模擬機組之後,會發現,忽略螞蟻編號,最後結果螞蟻的方向與開始的時候螞蟻的方向一樣,相對順序都一樣,爲什麼,位置就是每個螞蟻開始位置順着開始方向不變的行走T秒之後的位置,會這樣呢?可以這麼想:
1.兩個螞蟻碰撞,反向可以看成穿越,不考慮個別的轉移,最終結果也就是螞蟻的最終狀態
2.對於兩個螞蟻碰撞,其最終的相對結果不變,A在B前面,假設A於B在t時刻相撞,之後A也固然在B前面
由於題目給出來的螞蟻不是按照初始位置排序的,所以定義一個終態,表示螞蟻i,T秒後會在位置tar_order[i]上
Code:
#include <set>
#include <map>
#include <cmath>
#include <ctime>
#include <stack>
#include <queue>
#include <deque>
#include <vector>
#include <cstdio>
#include <bitset>
#include <cstdlib>
#include <cstring>
#include <algorithm>
using namespace std;

#define DIR     4
#define DIM     2
#define STATUS  2
#define MAXN    10000 + 10
#define MAXM    100000 + 10
#define oo      (~0u)>>1
#define INF     0x3F3F3F3F
#define LEFT    0
#define TURN    1
#define RIGHT   2
#define REPI(i, s, e)   for(int i = s; i <= e; i ++)
#define REPD(i, e, s)   for(int i = e; i >= s; i --)

static const double EPS = 1e-5;

typedef struct Ant_ {
int position, dir, idx;
}Ant;

Ant start[MAXN], end[MAXN];
int tar_order[MAXN];    //ith ant end order.
char status[][10] = { "L", "Turning", "R" };

inline int cmp(const Ant &a, const Ant &b)
{
return a.position < b.position;
}

int main(int argc, char const *argv[])
{
#ifndef ONLINE_JUDGE
freopen("test.in", "r", stdin);
#endif
int l, n, t, cas;
scanf("%d", &cas);
REPI(k, 1, cas) {
scanf("%d %d %d", &l, &t, &n);
REPI(i, 1, n) {
char ch[4];
start[i].idx = i;
scanf("%d %s", &start[i].position, ch);
if( 'L' == *ch ) {
start[i].dir = end[i].dir = LEFT;
end[i].position = start[i].position-t;
}
else if( 'R' == *ch ) {
start[i].dir = end[i].dir = RIGHT;
end[i].position = start[i].position+t;
}
}

sort(start+1, start+1+n, cmp);
REPI(i, 1, n) {
tar_order[start[i].idx] = i;
}

sort(end+1, end+1+n, cmp);
REPI(i, 1, n-1) {
if( end[i].position == end[i+1].position ) {
end[i].dir = end[i+1].dir = TURN;
}
}
printf("Case #%d:\n", k);
REPI(i, 1, n) {
int d = tar_order[i];
if( end[d].position < 0 || end[d].position > l ) {
printf("Fell off\n");
}
else {
printf("%d %s\n", end[d].position, status[end[d].dir]);
}
}
printf("\n");
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: