1. 程式人生 > >CCF認證201803-2 碰撞的小球 java程式碼實現。

CCF認證201803-2 碰撞的小球 java程式碼實現。

問題描述
  數軸上有一條長度為L(L為偶數)的線段,左端點在原點,右端點在座標L處。有n個不計體積的小球線上段上,開始時所有的小球都處在偶數座標上,速度方向向右,速度大小為1單位長度每秒。
  當小球到達線段的端點(左端點或右端點)的時候,會立即向相反的方向移動,速度大小仍然為原來大小。
  當兩個小球撞到一起的時候,兩個小球會分別向與自己原來移動的方向相反的方向,以原來的速度大小繼續移動。
  現在,告訴你線段的長度L,小球數量n,以及n個小球的初始位置,請你計算t秒之後,各個小球的位置。
提示
  因為所有小球的初始位置都為偶數,而且線段的長度為偶數,可以證明,不會有三個小球同時相撞,小球到達線段端點以及小球之間的碰撞時刻均為整數。
  同時也可以證明兩個小球發生碰撞的位置一定是整數(但不一定是偶數)。
輸入格式
  輸入的第一行包含三個整數n, L, t,用空格分隔,分別表示小球的個數、線段長度和你需要計算t秒之後小球的位置。
  第二行包含n個整數a1, a2, …, an,用空格分隔,表示初始時刻n個小球的位置。
輸出格式
  輸出一行包含n個整數,用空格分隔,第i個整數代表初始時刻位於ai的小球,在t秒之後的位置。
樣例輸入
3 10 5
4 6 8
樣例輸出
7 9 9

思路如下:

每個小球是一個類,分別含有三個屬性:方向,位置,編號。然後根據時間的推移對小球的位置進行判斷和推移。對小球的屬性進行更改。小球儲存在list列表中,因為arraylist的查詢效能比較強並且有序,將小球資訊儲存在arraylist中。最後輸出球的位置資訊。貼一下java程式碼,歡迎各位大佬批評指正。

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

public class BallMotion {
    public static void main(String[] args) {
        Scanner sc 
= new Scanner(System.in); int ballCount = sc.nextInt(); int lineLen = sc.nextInt(); int time = sc.nextInt(); List<Ball> ballList = new ArrayList<Ball>(); for (int i = 1; i <= ballCount; i++) { Ball ball = new Ball(i,1,sc.nextInt()); ballList.add(ball); }
for(int i = 1; i <= time;i++){ //開始時間迴圈 for(int j = 0; j< ballList.size(); j++){ //是否在盡頭 if(ballList.get(j).getPosition() == lineLen || ballList.get(j).getPosition() == 1){ ballList.get(j).setDirction(-ballList.get(j).getDirection()); } //是否有球重合 for (int k = 0; k< ballList.size(); k++) { if( k == j){ continue; }else{ if (ballList.get(j).getPosition() == ballList.get(k).getPosition()) { //重合時方向兩個球的方向都相反 ballList.get(j).setDirction(-ballList.get(j).getDirection()); ballList.get(k).setDirction(-ballList.get(k).getDirection()); } } } // 移動位置 ballList.get(j).setPosition(ballList.get(j).getPosition()+ ballList.get(j).getDirection()); } } //列印各個小球位置 for(int i = 0; i < ballCount; i++){ System.out.print(ballList.get(i).getPosition()+" ");; } } } class Ball { private int id;// 編號 private int direction;// 方向,1右 -1左 private int position;// 位置 public Ball() { } public Ball(int id, int direction, int position) { this.id = id; this.direction = direction; this.position = position; } public void setId(int id) { this.id = id; } public void setDirction(int direction) { this.direction = direction; } public void setPosition(int position) { this.position = position; } public int getId() { return id; } public int getDirection() { return direction; } public int getPosition() { return position; } }