1. 程式人生 > >CCF 碰撞的小球 C語言 201803-2

CCF 碰撞的小球 C語言 201803-2

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; }