Uva 10881 - Piotr's Ants

好吧,看到这题首先就想到了 每1s都去更新蚂蚁的位置,最后发现这样每次都要判断当前的这只蚂蚁和其他蚂蚁的位置关系

这样子不可行。

最后看了大白书之后, 才发现原来这么吊。。。

代码:

 

#include<stdio.h>
#include<math.h>
#include<string.h>
#include<algorithm>
#include<limits.h>
using namespace std;

struct ant
{
	int pos;//蚂蚁的位置
	int d; //蚂蚁的方向
	int x; //蚂蚁输入的位置 
}a[11111],hehe[11111];


int cmp1(ant x, ant y)
{
	return x.pos < y.pos;
}//按位置排序 

int cmp2(ant x, ant y)
{
	return x.x < y.x;
} //按输入顺序排序 

int main()
{
	int t; scanf("%d",&t);
	for(int k= 1; k<= t; k++)
	{
		int L,T,N;
		scanf("%d %d %d",&L,&T,&N);
		for(int i= 1; i<= N; i++)
		{
			int p;
			char ch;
			scanf("%d %c",&p,&ch);
			a[i].pos= p;
			if(ch == 'L')
				a[i].d= -1;
			else if(ch == 'R')
				a[i].d= 1;
			a[i].x= i;
		}	
		sort(a+ 1, a+ N+ 1, cmp1);
		for(int i= 1; i<= N; i++)
		{
			hehe[i].d = a[i].d;
			if(a[i].d == -1)			
				hehe[i].pos= a[i].pos - T;  //左减 
			else
				hehe[i].pos= a[i].pos + T;	//右加	
		}
		sort(hehe+ 1, hehe+ 1+ N,cmp1);
		for(int i= 1; i<= N; i++)
		{
			a[i].pos= hehe[i].pos;
			if(hehe[i].pos != hehe[i+1].pos && hehe[i].pos != hehe[i-1].pos)  
				a[i].d= hehe[i].d; //相碰的特判 
			else 
				a[i].d= 0;
		}
		sort(a+ 1, a+ N+ 1, cmp2);
		printf("Case #%d:\n",k);
		for(int i= 1; i<= N; i++)
			if(a[i].pos < 0 || a[i].pos > L)
				printf("Fell off\n");
			else
			{
				if(a[i].d == 0)
					printf("%d Turning\n",a[i].pos);
				else if(a[i].d == 1)
					printf("%d R\n",a[i].pos);
				else if(a[i].d == -1)
					printf("%d L\n",a[i].pos);		
			}
			printf("\n");			
	}
return 0;
}

你可能感兴趣的:(uva)