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,分析小球反向的兩種情況,觸底反向和碰撞反向。