CCF-CSP 201803-2碰撞的小球 简单思路满分题解
题目链接:201803-2碰撞的小球
思路:
1.对于每一秒单独判断,首先判断小球的位置是否到达最左端和最右端,如果达到则需要转换方向,判断完后再移动小球。
2.枚举小球的位置,判断小球之间是否碰撞,碰撞则改变两个小球的位置。
具体代码如下:
#include <iostream>
#include <algorithm>
const int N =1010;
using namespace std;
int n,l,t;
struct node{
int x;//初始位置
int dir=1;//初始方向向右,设置为1
};
int main()
{
cin>>n>>l>>t;
node p[N];
for(int i=1;i<=n;i++)
{
cin>>p[i].x;
}
for(int i=1;i<=t;i++)//对时间进行枚举,每个时间单独处理
{
for(int j=1;j<=n;j++)
{
if(p[j].x==l||p[j].x==0)//当小球到达最右端和最左端时,转换方向
{
p[j].dir=-p[j].dir;
}
p[j].x+=p[j].dir;//移动小球,每次移动一个单位长度
}
for(int j=1;j<=n;j++)//枚举小球的位置,判断小球之间是否碰撞
{
for(int k=1;k<=n&&k!=j;k++)
{
if(p[j].x==p[k].x)//当小球碰撞时,两个小球变化方向
{
p[j].dir=-p[j].dir;
p[k].dir=-p[k].dir;
}
}
}
}
for(int i=1;i<=n;i++)
{
cout<<p[i].x<<" ";
}
cout<<endl;
return 0;
}