CCF 碰撞的小球 C語言 201803-2
阿新 • • 發佈:2019-01-06
CCF 碰撞的小球
問題描述
數軸上有一條長度為L(L為偶數)的線段,左端點在原點,右端點在座標L處。有n個不計體積的小球線上段上,開始時所有的小球都處在偶數座標上,速度方向向右,速度大小為1單位長度每秒。
當小球到達線段的端點(左端點或右端點)的時候,會立即向相反的方向移動,速度大小仍然為原來大小。
當兩個小球撞到一起的時候,兩個小球會分別向與自己原來移動的方向相反的方向,以原來的速度大小繼續移動。
現在,告訴你線段的長度L,小球數量n,以及n個小球的初始位置,請你計算t秒之後,各個小球的位置。
提示
因為所有小球的初始位置都為偶數,而且線段的長度為偶數,可以證明,不會有三個小球同時相撞,小球到達線段端點以及小球之間的碰撞時刻均為整數。
同時也可以證明兩個小球發生碰撞的位置一定是整數(但不一定是偶數)。
輸入格式
輸入的第一行包含三個整數n, L, t,用空格分隔,分別表示小球的個數、線段長度和你需要計算t秒之後小球的位置。
第二行包含n個整數a1, a2, …, an,用空格分隔,表示初始時刻n個小球的位置
輸出格式
輸出一行包含n個整數,用空格分隔,第i個整數代表初始時刻位於ai的小球,在t秒之後的位置。
樣例輸入
3 10 5
4 6 8
樣例輸出
7 9 9
原始碼
#include <stdio.h>
int main()
{
int n,L,t;
int a[110];
int flag[110 ]= {0}; //0是正方向
scanf("%d %d %d",&n,&L,&t);
int i,j,k,p,q,x,l;
for(i=0; i<n; i++) //初始狀態是否在端點的判斷,設定方向
{
scanf("%d",&a[i]);
if(a[i]==L) flag[i]=1;//在右端點則反方向,向左
if(a[i]==0) flag[i]=0;//在左端點則正方向,向右
}
for(i=0; i<t; i++) //在t秒時間內,每一秒的變化
{
for (q=0; q<n; q++)
{
if(flag[q]==0) a[q]++;//正方向 加
else a[q]--;//反方向 減
}
for(j=0; j<n-1; j++) //相撞的判斷
{
for(k=j; k<n-1; k++)
{
if(a[j]==a[k+1])//a[j]與後面所有的數字一一對比,看是否相撞
{
if(flag[j]==0) //只有flag方向相反才會相撞
{
flag[j]=1;
flag[k+1]=0;
}
else
{
flag[j]=0;
flag[k+1]=1;
}
}
}
}
for(p=0; p<n; p++) //是否在端點判斷
{
if(a[p]==L) flag[p]=1;
//if(a[p]==0) flag[p]=-flag[p];
if(a[p]==0) flag[p]=0;
}
}
for(i=0; i<n; i++)
{
printf("%d ",a[i]);
}
return 0;
}