思路:我的思路是先把题目按时间顺序来拆分,每一秒每个球在的位置算出来。若位置一样相撞的情况用一个变量表方向(d,d=1为正向,d=-1为负向,相撞两球的d同时变号)。
#include <iostream>
using namespace std;
int n, L,t;
class Point{
public:
int d; /*方向 右(数轴正方向)为正,左为负*/
int x; /*当前时刻坐标*/
void input();
void ifpole();
void move();
};
void Point::input(){
cin>>x;
d=1;
}
void Point::ifpole(){
if(x==0||x==L)
d=-d;
}
void Point::move(){
x=x+d;
}
const int NUM=101;
Point p[NUM];
int main(){
cin>>n>>L>>t;
for(int i=0; i<n; i++)
p[i].input();
while(t--){
for(int i=0; i<n; i++)
{ p[i].move();
int k=i;
p[i].ifpole();
for(int j=0; j<n; j++)
{ if(k!=j)
{if(p[i].x==p[j].x){
p[i].d=-(p[i].d);
p[j].d=-(p[j].d);}
}else continue;
}
}
}
for(int i=0; i<n; i++)
cout<<p[i].x<<" ";
return 0;
}
有一个小点,一开始我用了类函数
void Point::ifhit(Point p1){
if(x==p1.x)
{
d=-d;
p1.d=-(p1.d);
}
} 来运算相撞情况,两个球方向变号。不可以。因为当main函数里调用ifhit时,p1的值改不了。原因是形参不能改变。
我懒得用指针,所以就干脆不用类函数,直接用代码。
我又要去观摩学习一下别人怎么写的啦嘻嘻