生活随笔
收集整理的這篇文章主要介紹了
CCF CSP 碰撞的小球 C++
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
碰撞的小球
代碼比較長是因為看錯題意,題目要求最后按序號輸出位置,因此既要存序號,也要存位置。先將小球按照初始位置排序,定義另一個數(shù)組mov來記錄小球移動的距離,每過一個單位時間判斷是否發(fā)生碰撞,并修改mov的方向和距離。t時間后記錄最后每個小球所在的位置,并按照小球序號重新排序。
#include<bits/stdc++.h>
using namespace std;
int n,l,t;
struct Ball{ //定義一個結構體,存球的序號和初始位置 int number;int location;
}ball[101];bool cmp1(Ball a,Ball b){ //定義兩個cmp函數(shù)用于將ball分別按照序號或位置排序 return a.location < b.location;
}bool cmp2(Ball a,Ball b){return a.number < b.number;
}int mov[101][2] ={0};/*定義一個mov數(shù)組mov[n][0]用于存放每個小球相對于初始位置的行進距離, mov[n][1]用于存放小球的行進方向,0代表前進,1代表后退 */
int check(int w ,int x, int y,int z){if(x + y ==l){ //定義一個判斷碰撞的函數(shù),有碰左邊,碰右邊,兩球相碰,不碰撞四種情況 return 1;}else if(x + y== w + z){return 2;}else if(x + y==0){return 3;}return 4;
}int main(){cin>>n>>l>>t;for(int i = 0; i < n; i++){cin>>ball[i].location;//輸入小球的初始位置,序號 ball[i].number = i;}sort(ball,ball+n,cmp1); //按照初始位置排序 for(int i = 0; i < t; i++){for(int k = 0; k < n; k++){int x = ball[k].location,y = mov[k][0],w = ball[k-1].location,z=mov[k-1][0];int flag = check(w,x,y,z);//檢查碰撞,根據(jù)情況使小球反向 if(flag==1 || flag == 3){mov[k][1] = mov[k][1] ^ 1;//異或反向 }else if(flag == 2){mov[k][1] = mov[k][1] ^ 1;mov[k-1][1] = mov[k-1][1] ^ 1;}}for(int j = 0; j < n; j++){ //正向移動距離增加,反向減少 if(mov[j][1] == 0){ mov[j][0]++;}else if(mov[j][1] == 1){mov[j][0]--;}}/*for(int i = 0; i < n; i++){cout<<a[i]+mov[i][0]<<" ";}cout<<endl;*/}for(int i = 0; i < n; i++){ball[i].location+=mov[i][0]; //計算每個小球t時間后的最終位置 }sort(ball,ball+n,cmp2);//重新按照序號排序 for(int i = 0 ; i < n; i++){cout<<ball[i].location<<" "; //輸出答案 }}
總結
以上是生活随笔為你收集整理的CCF CSP 碰撞的小球 C++的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。