//用两个数组分别记录小球的位置和方向。对n个小球分别调整t轮,每一轮更新方向和位置,必须先更新方向再更新位置:到达最左端方向调整为向右,到达最右端方向调整为向左;相撞后方向取反;其他时刻向右走一步加1,向左走一步减1,可以统一表示为a[j]+b[j]。注意这n个小球的初始位置是无序的,所以不能a[i]==a[i+1]表示碰撞。检测碰撞的时候内层循环要从k=j+1开始,否则每对相当于改变了两次符号,就错了。
#include <iostream>
using namespace std;
int main()
{
int n,t,L;
cin >> n >> L >> t;
int a[1000]={0},b[1000]={0};
for(int s=0;s<n;s++)//初始值存入数组
{
cin >> a[s];
b[s]=1;//方向初始化为向右
}
for(int i=0;i<t;i++)//t轮调整
{
//处理端点方向
for(int j=0;j<n;j++)
{
if(a[j]==0) b[j]=1;
else if(a[j]==L) b[j]=-1;
}
//处理相撞后的方向
for(int j=0;j<n;j++)
{
for(int k=j+1;k<n;k++)
{
if(a[j]==a[k])
{
b[j]*=-1;
b[k]*=-1;
}
}
}
//位置更新
for(int j=0;j<n;j++)
a[j]+=b[j];
}
for(int k=0;k<n;k++)
cout << a[k] << " ";
//cout << endl;
return 0;
}
以上是100分代码
二刷:
#include <bits/stdc++.h>
struct point{
int pos;
int flag;//1右-1左
};
using namespace std;
int main()
{
int n,l,t;
cin >> n >> l >> t;
point a[n];
for(int i=0;i<n;i++)
{
cin >> a[i].pos;
a[i].flag=1;
}
for(int j=0;j<t;j++)
{
for(int i=0;i<n;i++)
{
if(a[i].pos==l)
{
a[i].flag=-1;
}
if(a[i].pos==0)
{
a[i].flag=1;
}
}
for(int i=0;i<n;i++)
{
for(int k=i+1;k<n;k++)
{
if(a[i].pos==a[k].pos)
{
a[i].flag*=-1;
a[k].flag*=-1;
}
}
}
for(int i=0;i<n;i++)
{
a[i].pos+=a[i].flag;
}
}
for(int i=0;i<n;i++)
{
cout << a[i].pos << " ";
}
return 0;
}