算法入门之蚂蚁

一根长度为L厘米的木棍上有n个蚂蚁,每个蚂蚁要么朝左爬,要么朝右爬,速度为1厘米/秒,当两只蚂蚁相撞时,二者同时掉头,给出每只蚂蚁的初始位置和朝向,计算T秒之后每只蚂蚁的位置

每组数据的第一行输入L,T,n,其中x表示蚂蚁距离木棍的距离,字母表示初始朝向,若T秒之前已经掉下木棍的蚂蚁输出Fell off(turning表示正在碰撞)


#include <iostream>
#include <algorithm>
#include <cstring>
#include <cstdio>
using namespace std;
struct node
{
	int i;//输入的顺序 
	int x;//蚂蚁距离木棍左端的距离 
	int t;//初始朝向 
}Node[10005],after[10005];
const char dirName[][10]={"L","Turning","R"};
int cmp(node a,node b)
{
	return a.x<b.x;
}
int order[10005];//表示输入的第i只蚂蚁是终态的左数第order[i]只蚂蚁
int main()
{
	int L,T,n;
	int m;
	while(cin>>m)
	{
		for(int k=1;k<=n;k++)
		{
          cin>>L>>T>>n;
          cout<<"Case #"<<k<<endl;
          char r;
		  for(int i=0;i<n;i++)
		  {
  		    cin>>Node[i].x;
	  		cin>>r;
		  	Node[i].i=i;
	  		Node[i].t=(r=='L'?-1:1);
	  		
	  		after[i].i=0;
	  		after[i].x=Node[i].x+T*Node[i].t;
	  		after[i].t=Node[i].t;
	      }
	      sort(Node,Node+n,cmp); 
	      for(int i=0;i<n;i++)
	      {
      		order[Node[i].i]=i;
       	  }
       	  sort(after,after+n,cmp);
       	  for(int i=0;i<n-1;i++)//修改碰撞中的蚂蚁的朝向
       	  {
  	       	if(after[i].x==after[i+1].x)
  	       	after[i].t=after[i+1].t=0;
          }
          for(int i=0;i<n;i++)//修改结果
          {
          	int a=order[i];
          	if(after[a].x<0||after[a].x>L)
          	cout<<"Fell off"<<endl;
          	else
          	cout<<after[a].x<<" "<<dirName[after[a].t+1]<<endl;
          }
          cout<<endl;
		}
	  
	}
	return 0;
}

所有蚂蚁的相对顺序是不变的,因此把所有目标位置从小到大排序,则从左到右的每个位置对应于初始状态下从左到右的每只蚂蚁,但是还要预处理计算出输入中的第i只蚂蚁的序列order[ i ];
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值