CCF201803-2コリジョンボールのC言語コード

#include<stdio.h>
#include<stdlib.h>
int main()
{
    
    
    int n,l,t,i,j,k,m;
    scanf("%d",&n);
    scanf("%d",&l);
    scanf("%d",&t);
    //pos数组记录各个小球的位置
    //direction数组记录各个小球的方向,同时也用于小球的移动步距
    //isstrike数组记录是否发生碰撞
    int pos[n];
    int direction[n];
    int isstrike[n];
    //首先输入各个小球的初始位置
    for(i=0;i<n;i++)
    {
    
    
        direction[i]=1;
        scanf("%d",&pos[i]);
    }
    //然后判断是否有小球的初始位置是否正好为长度(若长度是偶数的话)
    //若是的话把它的方向改为-1,方便接下来1秒的移动。
    for(i=0;i<n;i++)
    {
    
    
        if(pos[i]==l)
            direction[i]=-1;
    }
    /*
        i表示这样的含义:i的数值代表这是第i秒后
        例如在i=1时,循环里的内容代表1秒后应该做的操作有:
        1.首先把这1秒内小球应该移动的距离放在这一刻来做:每一个小球的位置向左或者向右移动一个单位,即表现为数值上+1或-1
        2.为下一秒(即第2s)的移动做好准备,主要是指direction数组做好准备:
          首先若此时的小球的位置在0或l处,方向调转
          其次分析此时是否有小球相撞,若有相撞的小球,则把他们的方向都转向。
        另外在分析是否有小球相撞时不要这样做:i与j相撞,在处理i时已经把i与j都转向了,在遍历到J时又把i与j转向了一遍
        因此从前往后遍历检查时只要确定碰撞了就不要在检查了
    */
    for(i=1;i<=t;i++)
    {
    
    
       for(j=0;j<n;j++)
       {
    
    
            pos[j]+=direction[j];
            isstrike[j]=0;
            if(pos[j]==0||pos[j]==l)
                direction[j]*=-1;
       }
       for(j=0;j<n;j++)
       {
    
    
           if(isstrike[j]==0)
           {
    
    
              for(k=0;k<n;k++)
               {
    
    
                   if((pos[j]==pos[k])&&(j!=k))
                   {
    
    
                      isstrike[j]=1;
                      isstrike[k]=1;
                      direction[j]*=-1;
                      direction[k]*=-1;
                   }
               }
           }
       }
    }
    for(i=0;i<n;i++)
    {
    
    
        if(i==0)
            printf("%d",pos[i]);
        else
            printf(" %d",pos[i]);
    }
    return 0;
}

おすすめ

転載: blog.csdn.net/weixin_44142774/article/details/112347007