1623 - 坠落的蚂蚁

通过次数

0

提交次数

0

时间限制 : 1 秒 内存限制 : 32 MB

一根长度为1米的木棒上有若干只蚂蚁在爬动。它们的速度为每秒一厘米或静止不动,方向只有两种,向左或者向右。如果两只蚂蚁碰头,则它们立即交换速度并继续爬动。三只蚂蚁碰头,则两边的蚂蚁交换速度,中间的蚂蚁仍然静止。如果它们爬到了木棒的边缘(0或100厘米处)则会从木棒上坠落下去。在某一时刻蚂蚁的位置各不相同且均在整数厘米处(即1,2,3,…99厘米),有且只有一只蚂蚁A速度为0,其他蚂蚁均在向左或向右爬动。给出该时刻木棒上的所有蚂蚁位置和初始速度,找出蚂蚁A从此时刻到坠落所需要的时间。

题目输入

第一行包含一个整数表示蚂蚁的个数N(2<=N<=99),之后共有N行,每一行描述一只蚂蚁的初始状态。每个初始状态由两个整数组成,中间用空格隔开,第一个数字表示初始位置厘米数P(1<=P<=99),第二个数字表示初始方向,-1表示向左,1表示向右,0表示静止。

题目输出

蚂蚁A从开始到坠落的时间。若不会坠落,输出“Cannot fall!”

输入/输出样例

输入格式

2
44 0
41 1
2
13 0
63 1
4
56 0
64 -1
85 -1
47 1

输出格式

59
Cannot fall!
85

C语言解答

struct number
{double address;
int direction;
}num[100];
int main(int argc, char* argv[])
{int n,i,j,mb,count,time,k,kj,bh[3],tem;
double i1;
while(~scanf("%d",&n))
{     time=0;k=0;kj=0;
	for(i=0;i<n;i++)
	{	scanf("%lf%d",&num[i].address,&num[i].direction);
	if(num[i].direction==0)mb=i;
	}
while(1)
{ if(k==1)break;
	for(i1=0;i1<=100;i1=i1+0.5)
	{ count=0;
	 for(j=0;j<n;j++)
		 if(i1==num[j].address){bh[count]=j;count++;}
	     if(count==2){   
			 tem=num[bh[0]].direction;num[bh[0]].direction=num[bh[1]].direction;num[bh[1]].direction=tem;}
	    if(count==3){
			if(num[bh[0]].direction==0){
				tem=num[bh[1]].direction;num[bh[1]].direction=num[bh[2]].direction;num[bh[2]].direction=tem;}
			if(num[bh[1]].direction==0){
				tem=num[bh[0]].direction;num[bh[0]].direction=num[bh[2]].direction;num[bh[2]].direction=tem;}
			if(num[bh[2]].direction==0){
				tem=num[bh[1]].direction;num[bh[1]].direction=num[bh[0]].direction;num[bh[0]].direction=tem;}
		}
	}
	for(j=0;j<n;j++)
	{
	if(num[j].address==0||num[j].address==100)	
	{  if(j==mb){printf("%d\n",time/2);k=1;break;}
	  else {kj++;num[j].direction=0;num[j].address=-1; }
	}
	 num[j].address+=num[j].direction*0.5;
	}
	if(n-kj==1){printf("Cannot fall!\n");k=1;}
	time++;
}
}
	return 0;
}

C++解答

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

struct Node
{
        int speed;
        int position;
}ant[110];

void Swap(int a,int b)
{
        int tmp=ant[a].speed;
        ant[a].speed=ant[b].speed;
        ant[b].speed=tmp;
}

bool cmp(Node a,Node b)
{
        return a.position<b.position;
}

int gao(int N,int goal)
{
        int head=0,tail=N-1;
        int time=0;
        while(1)
        {
                if(time>210)return -1;
                time++;
                for(int i=head;i<=tail;i++)
                        ant[i].position+=ant[i].speed;//每0.5秒移动一次
                for(int i=head;i<=tail;i++)
                        if(ant[i].speed==1)//两移动的蚂蚁相撞
                        {
                                if(i<tail&&ant[i+1].speed==-1&&ant[i+1].position==ant[i].position)
                                Swap(i,i+1);
                        }
                        else if(ant[i].speed==-1)
                        {
                                if(i>head&&ant[i-1].speed==-1&&ant[i-1].position==ant[i].position)
                                        Swap(i-1,i);
                        }
                        else if(ant[i].speed==0)//三只蚂蚁相撞
                        {
                                if(i>head&&i<tail&&ant[i].position==ant[i-1].position&&ant[i].position==ant[i+1].position&&ant[i-1].speed==1&&ant[i+1].speed==-1)
                                        Swap(i-1,i+1);//左边的蚂蚁撞上静止的蚂蚁
                                else if(i>head&&ant[i].position==ant[i-1].position&&ant[i-1].speed==1)
                                        Swap(i-1,i);//右边的蚂蚁撞上静止的蚂蚁
                                else if(i<tail&&ant[i].position==ant[i+1].position&&ant[i+1].speed==-1)
                                        Swap(i,i+1);
                        }
                
                if(ant[goal].position<=0||ant[goal].position>=200)return time/2;
                if(ant[head].position<=0)head++;
                if(ant[tail].position>=200)tail--;
        }
        return -1;
}

int main()
{
        int N;
        while(cin>>N)
        {
                int goal=-1;
                for(int i=0;i<N;i++)
                {
                        cin>>ant[i].position>>ant[i].speed;
                        ant[i].position*=2;
                }
                sort(ant,ant+N,cmp);
                for(int i=0;i<N;i++)
                        if(ant[i].speed==0)
                                goal=i;
                int res=gao(N,goal);
                if(res==-1)
                        cout<<"Cannot fall!"<<endl;
                else
                        cout<<res<<endl;
        }
        return 0;
}