pair
#include<utility>
pair<int,int> ball;
pair<int,int> ball(1,0);//first初始化为1,second初始化为0
ball.first;
ball.second;
MyAnswer
#include<iostream>
#include<utility>
#include<memory.h>
using namespace std;
int main()
{
int n, l, t;//n小球个数,L线段长度,t时间
cin >> n >> l >> t;
pair<int, int> *ball = new pair<int, int>[n + 1];//数组下标为小球标号,first记录位置,second记录运动方向
int *line = new int[l + 1];//记录每个位置的小球数
memset(line, 0, (l + 1) * sizeof(int));
for (int i = 1; i < n+1; i++)
{
cin >> ball[i].first;
ball[i].second = 1;
line[ball[i].first]++;
}
for (int i = 1; i <= t; i++)//共t秒
{
//更新小球位置
for (int j = 1; j <= n; j++)
{
int pos = ball[j].first;
int dir = ball[j].second;
line[pos]--;//更新位置上的小球数
line[pos + dir]++;
ball[j].first += ball[j].second;
}
//小球碰撞则反向
for (int j = 0; j <= l; j++)
{
if (line[j] == 2)
{
for (int k = 1; k <= n; k++)
{
if (ball[k].first == j)
ball[k].second *= -1;
}
}
}
//小球触壁则反向
for (int k = 1; k <= n; k++)
{
if (ball[k].first == 0 || ball[k].first == l)
ball[k].second *= -1;
}
}
for (int i = 1; i <= n; i++)
{
cout << ball[i].first<<" ";
}
cout << endl;
delete[]ball;
delete[]line;
return 0;
}
1.需要保存哪些数据?小球的标号,位置,速度方向,每个位置的小球数
用什么保存
2.数组下标与小球标号的统一,是从0开始还是从1开始
3.L与n区分清楚
中级模拟并不困难,过程走得细心,很快就可以解决,如果过程有误,很难有耐心检查,注意手动debug和打印debug共用