题目描述
解题思路
题意就是一群小球在线段上运动,给出球的初始位置和运动方向,问在t时间后小球的位置
小球只会有两种行为,一种是移动,一种是反向
当与别的小球碰撞时,会反向,所以要判断两个小球是否会碰撞
判断两个小球是否会碰撞,那么就要知道此时刻小球所在的位置,所以可以根据时间来依次移动小球
每一秒,移动过后,判断该小球是否与前面已经移动过的小球相撞,若是,两球反向
还需注意,移动过程中,超出线段范围需要反向
代码实现
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 110;
int a[N]; //存储当前小球所在位置
bool dir[N]; //false代表正方向
int main()
{
int n, L, t;
cin >> n >> L >> t;
for (int i = 0; i < n; i ++)
{
cin >> a[i];
}
while (t --)
{
for (int i = 0; i < n; i ++)
{
//根据运动方向运动一格
if (dir[i]) a[i] --;
else a[i] ++;
//如果超出了线段,纠正位置,并改变方向
if (a[i] > L)
{
a[i] = L - 1;
dir[i] = !dir[i];
}
if (a[i] < 0)
{
a[i] = 1;
dir[i] = !dir[i];
}
//如果此时的位置与已经运动过的小球碰撞,那么两个小球都反向
for (int j = 0; j < i; j ++)
{
if (a[i] == a[j])
{
dir[i] = !dir[i];
dir[j] = !dir[j];
break; //不会出现三个小球的碰撞
}
}
}
}
for (int i = 0; i < n; i ++)
{
cout << a[i] << " ";
}
return 0;
}