?一、題目描述
?二、思路
1.首先妾身分析這個題目,想要解題,得得解決2個問題。
1)判斷小球到達端點或碰撞然后改變方向;
2)每時刻都要改變位置
兩個問題都比較好解決,1)只要簡單判斷坐標,符合條件就將速度加個負號就成了,2)只要知道原來坐標+速度?時間=新坐標就好了。因為每個時刻都有可能碰撞,每一秒都判斷就好了。
三、代碼
話不多說,來看妾身的代碼呀!
#include <iostream>
using namespace std;struct ball
{int position;//小球的位置int v;//速度的方向
}b[105];void changePositionV(struct ball b[], int n, int L)
{int i, j;//到達左右端點就改變方向for (i = 0; i < n; i++){if (b[i].position == 0 || b[i].position == L){b[i].v = -b[i].v;}}//到達同一位置,小球碰撞,方向改變for (i = 0; i < n-1; i++){for (j = i + 1; j < n; j++){if (b[i].position == b[j].position){b[i].v = -b[i].v;b[j].v = -b[j].v;}}}//更新位置for (i = 0; i < n; i++){b[i].position += b[i].v;}
}
int main()
{int n, L, t;cin >> n >> L >> t;int i;//輸入初始位置,并初始化速度方向for (i = 0; i < n; i++){cin >> b[i].position;b[i].v = 1;}while (t){changePositionV(b, n, L);t--;}//輸出結果for (i = 0; i < n; i++){cout << b[i].position << " ";}return 0;
}
四、思考總結
妾身還想了一下,覺得先更新位置,再判斷是否碰撞也是可以的,也就是將函數改成如下:
//先更新位置,再判斷是否碰撞
void changePositionV(struct ball b[], int n, int L)
{int i, j;//更新位置for (i = 0; i < n; i++){b[i].position += b[i].v;}//到達左右端點就改變方向for (i = 0; i < n; i++){if (b[i].position == 0 || b[i].position == L){b[i].v = -b[i].v;}}//到達同一位置,小球碰撞,方向改變for (i = 0; i < n-1; i++){for (j = i + 1; j < n; j++){if (b[i].position == b[j].position){b[i].v = -b[i].v;b[j].v = -b[j].v;}}}
}
小女子感覺自己的思路還比較中規中矩,應該還有更高效的解決方法,誒呀!希望以后能越來越棒!各位公子有沒有更好的方法呀,可以教教妾身呀!