UVA 10881_Piotr's Ant

16 篇文章 0 订阅
6 篇文章 0 订阅

问题描述:

在L cm长的杆子上有n只蚂蚁,蚂蚁的移动速度为1 cm/s,题目并告知这些蚂蚁的初始位置pos及将要移动的方向L or R。如果两只蚂蚁相遇则各自方向倒置,即往原移动方向相反的方向移动。求最终各个蚂蚁的位置及最终方向。


解题方法:

根据题目意思,终止时刻每只蚂蚁相对其他蚂蚁的位置是稳定的,即一只蚂蚁不会穿过另一只蚂蚁。我们可以假设把每只蚂蚁看作一样的,因为其最终时刻的位置相对假设之前是一样的,只是蚂蚁不一样而已,再把位置序列排序,依次对应具体的蚂蚁即可。



#include <iostream>
#include <algorithm>
#include <string>
#include <vector>
#include <map>
#define MAX(a,b) (a)>(b)?(a):(b)
using namespace std;
const int MAXSIZE = 10010;
int index[MAXSIZE];
struct ANT{							// save the position and its direction
	int id;
	int pos;
	char dir;
};
vector<ANT> origin, finish;
bool cmp(const ANT &p1,const ANT &p2){
	return p1.pos < p2.pos;
}
int main()
{
	int N,Case=0;			// N test cases
	int L, T, n;	// L cm, T s, n ants
	int i,j;
	scanf("%d", &N);
	while (N--){
		i = 0;
		origin.clear();
		finish.clear();
		scanf("%d %d %d", &L, &T, &n);
		while (n--){						//n ants
			ANT ant;
			scanf("%d %c", &ant.pos, &ant.dir);
			ant.id = i++;
			origin.push_back(ant);
		}
		for (j = 0; j < i; j++){
			ANT ant;
			ant.pos = (origin[j].dir == 'L') ? origin[j].pos - T : origin[j].pos + T;
			ant.dir = origin[j].dir;
			finish.push_back(ant);
		}
		sort(finish.begin(), finish.end(), cmp);
		sort(origin.begin(), origin.end(), cmp);
		for (j = 0; j < i; j++){
			index[origin[j].id] = j;
		}
		cout << "Case #" << ++Case << ":" << endl;
		for (j = 0; j < i; j++){
			int tmpIndex = index[j];
			if (finish[tmpIndex].pos<0 || finish[tmpIndex].pos>L){
				cout << "Fell off" << endl;
				continue;
			}
			cout << finish[tmpIndex].pos << " ";
			if ((tmpIndex - 1 >= 0 && finish[tmpIndex - 1].pos == finish[tmpIndex].pos) || (tmpIndex + 1<i&&finish[tmpIndex + 1].pos == finish[tmpIndex].pos)){
				cout << "Turning" << endl;
			}
			else {
				cout << finish[tmpIndex].dir << endl;
			}
		}
		cout << endl;
		
	}
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值