#include <bits/stdc++.h>
using namespace std;
const int N = 100;
int main() {
int n, _n, L, t, i = 0;
// 数组a记录为小球当前位置, 数组b记录为小球运动方向
int a[N], b[N];
// 初始的运动方向为向右,用1表示;向左,用-1表示
for (int j = 0; j < N; j++) {
b[j] = 1;
}
cin >> n >> L >> t;
_n = n;
while(n-- > 0){
cin >> a[i++];
}
// t次运动
for (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] *= -1;
}
}
// 如果有找到相同位置的小球,而且反向,判断为碰撞
for (int j = 0; j < _n - 1; j++) {
for (int k = j + 1; k < _n; k++) {
if (j != k) {
if (a[j] == a[k] && b[j] != b[k]) {
b[j] *= -1;
b[k] *= -1;
break;
}
}
}
}
// 根据方向加1距离或者减1距离
for (int j = 0; j < _n; j++) {
a[j] += b[j];
}
}
for (i = 0; i < _n; i++) {
if (i < _n - 1) {
cout << a[i] << ' ';
}
else {
cout << a[i] << endl;
}
}
return 0;
}
不算难但需要稍加思考的一道题目,刚开始总是不对,错在找相同位置小球的那个两次for循环,刚开始是这么做的
for (int j = 0; j < _n; j++) {
for (int k = 0; k < _n; k++) {
if (j != k) {
if (a[j] == a[k] && b[j] != b[k]) {
b[j] *= -1;
b[k] *= -1;
break;
}
}
}
}
这么做,会导致查找到位置相同的元素两次,重复更改方向,和没改一样,每次循环要把把判断过的元素过滤掉