CCF认证2018年3月份 第2道 小球碰撞-C语言编程解析

时间:2022-03-30 21:31:45

两面墙之间有n个小球,初始以每单位时间1单位长度向右运动,当小球撞到墙或者两个小球相撞时,小球向反方向运动,速度不变。(各小球初始位置和墙距均为偶数,不存在三个小球同时碰撞的情况)

要求: 

1.第一行输入三个正整数:小球个数n,墙之间的距离L;时间t;

2.第二行输入n个偶数表示小球的起始位置;

3.输出经过t时间后各小球的位置

程序如下:
#include<stdio.h>
#define N 31
int main()
{
 int a[N],b[N];
 int n,L,t;
 int i,j,k,flag=-1;
 //对n、L、t进行赋值
 scanf("%d%d%d",&n,&L,&t);
 //对n个小球的位置进行赋值
 for(i=1;i<=n;i++)
 {
  scanf("%d",&a[i]);
 }
 //b[i]数组代表n个小球的速度方向,1为向右,-1为向左,初始值为向右
 for(i=1;i<=n;i++)
 {
  b[i]=1;
 }
 
 //对t时间的位置进行判断
 for(k=1;k<=t;k++)
 {
  //先判断两端的位置,a[i]为L或者0时,反向
  for(i=1;i<=n;i++)
  {
   if((a[i]==L&&b[i]==1)||(a[i]==0&&b[i]==-1))
   {
    //仅对方向进行调整
    b[i]=flag*b[i];
   }
  }
  //每经过1秒a[i]进行一次运算
  for(i=1;i<=n;i++)
  {
   a[i]=a[i]+b[i]; 
  }
  
  //对距离相等时进行方向的反向操作
  for(i=1;i<=n;i++)
   for(j=1;j<=n;j++)
   {
    if(i!=j&&a[i]==b[j])
    { 
     //方向反向
     b[i]=flag*b[i]; 
    }
   } 
 }
 
 //输出a[i]
 for(i=1;i<=n;i++)
 {
  printf("%d ",a[i]);
 }
 printf("\n");
return 0;
}
    大致思路:对小球设定一个方向数组b[N],方向辅助变量flag,分析小球反向的两种情况,触底反向和碰撞反向。