1. 程式人生 > >CCF認證2018年3月份 第2道 小球碰撞-C語言程式設計解析

CCF認證2018年3月份 第2道 小球碰撞-C語言程式設計解析

兩面牆之間有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]==a[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,分析小球反向的兩種情況,觸底反向和碰撞反向。