csp_碰撞的小球
題目鏈接
使用一個(gè)結(jié)構(gòu)體存儲(chǔ)小球的位置和運(yùn)動(dòng)方向,每過1s就改變每個(gè)小球的位置,這可以通過一層for解決,如果到達(dá)邊界就方向反向,(分析出不會(huì)有倆小球同時(shí)到邊界),接著用雙重for檢查每個(gè)小球是否存在和它位置相同的小球,(不會(huì)同時(shí)有3小球碰撞,同一位置更不會(huì)有四個(gè)小球,因此在同一位置肯定只有一對(duì)球),改變這一對(duì)球的方向,這里有一個(gè)問題是不加處理的話,A會(huì)找到B同位置然后方向互換,B會(huì)找到A同位置然后方向互換,導(dǎo)致相當(dāng)于沒變更方向,解決方法是對(duì)每個(gè)坐標(biāo)位置記錄在這里碰撞的次數(shù),初值是0,有小球在此位置碰撞就自增1,如果是奇數(shù),表示第一次碰撞,讓兩球方向互換,如果偶數(shù)則不變方向。也可以用個(gè)bool類型輔助判斷。
處理麻煩了,找同一位置j不需要從頭開始找,從j+1就可:
代碼:
#include <iostream> #include <bits/stdc++.h> using namespace std;struct Ball{int pos;bool dir;//true為向右 false為向左 }balls[101]; int position[1001]={0};//奇數(shù)表示第一次處理碰撞情形,偶數(shù)表示第二次處理碰撞情形int main() {int n,L,t;cin >> n >> L >> t;for(int i=0;i<n;i++){cin >> balls[i].pos;balls[i].dir=true;//開始都是向右走}while(t--){//每一秒先依據(jù)位置和方向改變位置for(int i=0;i<n;i++){if(balls[i].dir==true) balls[i].pos++;else balls[i].pos--;if(balls[i].pos==0 || balls[i].pos==L)balls[i].dir=!balls[i].dir;//到邊界改變位置}//對(duì)每個(gè)球檢查位置相同的,改變方向for(int i=0;i<n;i++){for(int j=0;j<n;j++){//處理麻煩了,其實(shí)j從i+1遍歷就行if(i!=j && balls[i].pos == balls[j].pos){position[balls[i].pos]++;if(position[balls[i].pos] &1){//奇數(shù)是第一次改變balls[i].dir=!balls[i].dir;balls[j].dir=!balls[j].dir;}}}}}for(int i=0;i<n;i++){cout << balls[i].pos << " ";}return 0; }總結(jié)
- 上一篇: ThinkPHP 2.x 任意代码执行漏
- 下一篇: CS224n课程Assignment2参