#include<stdio.h>
#include<stdlib.h>
int main()
{
int n,l,t,i,j,k,m;
scanf("%d",&n);
scanf("%d",&l);
scanf("%d",&t);
//pos数组记录各个小球的位置
//direction数组记录各个小球的方向,同时也用于小球的移动步距
//isstrike数组记录是否发生碰撞
int pos[n];
int direction[n];
int isstrike[n];
//首先输入各个小球的初始位置
for(i=0;i<n;i++)
{
direction[i]=1;
scanf("%d",&pos[i]);
}
//然后判断是否有小球的初始位置是否正好为长度(若长度是偶数的话)
//若是的话把它的方向改为-1,方便接下来1秒的移动。
for(i=0;i<n;i++)
{
if(pos[i]==l)
direction[i]=-1;
}
/*
i表示这样的含义:i的数值代表这是第i秒后
例如在i=1时,循环里的内容代表1秒后应该做的操作有:
1.首先把这1秒内小球应该移动的距离放在这一刻来做:每一个小球的位置向左或者向右移动一个单位,即表现为数值上+1或-1
2.为下一秒(即第2s)的移动做好准备,主要是指direction数组做好准备:
首先若此时的小球的位置在0或l处,方向调转
其次分析此时是否有小球相撞,若有相撞的小球,则把他们的方向都转向。
另外在分析是否有小球相撞时不要这样做:i与j相撞,在处理i时已经把i与j都转向了,在遍历到J时又把i与j转向了一遍
因此从前往后遍历检查时只要确定碰撞了就不要在检查了
*/
for(i=1;i<=t;i++)
{
for(j=0;j<n;j++)
{
pos[j]+=direction[j];
isstrike[j]=0;
if(pos[j]==0||pos[j]==l)
direction[j]*=-1;
}
for(j=0;j<n;j++)
{
if(isstrike[j]==0)
{
for(k=0;k<n;k++)
{
if((pos[j]==pos[k])&&(j!=k))
{
isstrike[j]=1;
isstrike[k]=1;
direction[j]*=-1;
direction[k]*=-1;
}
}
}
}
}
for(i=0;i<n;i++)
{
if(i==0)
printf("%d",pos[i]);
else
printf(" %d",pos[i]);
}
return 0;
}
CCF 201803-2 碰撞的小球 C语言代码
猜你喜欢
转载自blog.csdn.net/weixin_44142774/article/details/112347007
今日推荐
周排行