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

Piotr's Ants UVA - 10881

2017-09-27 22:48 429 查看
当蚂蚁A与蚂蚁B碰头时,A与B都要切换方向,考虑个体难以实现,用整体考虑,A与B相遇之后,可以认为A,B直接穿过对方,order数组用来存储输入顺序在排序后的数组的下标

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;

const int MAXN = 10000 + 5;

struct Ant {
int id; //输入顺序,输出时按照此顺序
int p; //位置
int d; //朝向,-1 :L, 0 :T,1 :R
bool operator < (const Ant &a) const {//按距左端点的距离排序
return p < a.p;
}
} before[MAXN], after[MAXN];//初始数组,终态数组

const char dirName[][10] = {"L", "Turning", "R"};//答案状态

int order[MAXN]; //输入的第i只蚂蚁是状态中的左数第order[i]只蚂蚁

int main() {
int K;
scanf("%d", &K);
for(int kase = 1; kase <= K; ++kase) {
int L, T, n;
printf("Case #%d:\n", kase);
scanf("%d%d%d", &L, &T, &n);
for(int i = 0; i < n; ++i) { //Input
int p, d;
char c;
scanf("%d %c", &p, &c);
d = (c == 'L' ? -1 : 1);
before[i] = (Ant) {
i, p, d
};
after[i] = (Ant) {
0, p + T * d, d //T时间后必定有某个蚂蚁状态为此
}; //id是未知的
}

//计算order数组
sort(before, before + n);
for(int i = 0; i < n; ++i) {
order[before[i].id] = i; //id是几就第几个输出,id映射到数组位置
}

//计算终态
sort(after, after + n); //按照距离左端点顺序排序,蚂蚁运动后,不会影响其相对位置,order的可行原因
for(int i = 0; i < n - 1; ++i) {
if(after[i].p == after[i + 1].p) { //修改碰撞中的蚂蚁的方向
after[i].d = after[i + 1] .d = 0;
}
}

//输出结果
for(int i = 0; i < n; ++i) {
int a = order[i];
if(after[a].p < 0 || after[a].p > L) { //已经跌落
printf("Fell off\n");
} else {
printf("%d %s\n", after[a].p, dirName[after[a].d + 1]);
}
}
printf("\n");
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  ACM 思路