刚刚读这道题的时候,感觉有点难,以为要用递归来写······但思考CCF第二题一般都是比较简单,可以一个main函数搞定,于是放弃了这个想法。
#include<iostream>
using namespace std;
int main()
{
int n,l,t;
cin>>n>>l>>t;
int a[1001],b[1001];
for(int i=0;i<n;i++)
{
cin>>a[i];//小球初始位置
b[i]=1;//小球运动方向,每秒a[i]+=b[i]
}
int j1;
for(int i=0;i<t;i++)
{
for(int j=0;j<n;j++)
{
//当小球向左或向右运动到两端时
if((a[j]==0&&b[j]==-1)||(a[j]==l&&b[j]==1))
{
b[j]=-b[j];
}
else//当两只小球碰撞时
for(int j1=0;j1<n;j1++)
{
if(a[j1]==a[j]&&j1!=j)
{
b[j]=-b[j];
b[j1]=-b[j1];
//在这里两只小球的运动方向都要反向,因为当j小球反向后,紧接着j小球的位置a[j]将发生变化,而当遍历到和j碰撞的小球j1的时候,j小球的位置已经发生了变化,所以无法正确判断出j1小球发生了碰撞,因此在此处j1小球也要改变运动方向。
}
}
a[j]=a[j]+b[j];
}
}
for(int i=0;i<n-1;i++)
{
cout<<a[i]<<" ";
}
cout<<a[n-1]<<endl;
return 0;
}