1 条题解

  • 0
    @ 2024-12-24 9:59:26

    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;
    }
    
    • 1

    信息

    ID
    1473
    时间
    1000ms
    内存
    32MiB
    难度
    (无)
    标签
    递交数
    0
    已通过
    0
    上传者