zoukankan      html  css  js  c++  java
  • CCF认证201803-2 碰撞的小球 java&C++代码实现。

    问题描述
      数轴上有一条长度为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;
        }
    
    }

     最近练习C++,再贴一把C++代码(思路还是没变,没想到过了这么久,思路还是一样的)

    #include<iostream>
    #include<list>
    
    using namespace std;
    class ball {
    public:
        int id;
        int direction;//1为右-1为左
        int position;//当前位置
    };
    int main() {
        int ballcount, lineLen, time;
        cin >> ballcount >> lineLen >> time;
        int pos;
        list<ball> balist;
        for (int i = 1; i <= ballcount; i++) {
            cin >> pos;
            ball b;
            b.id = i;
            b.direction = 1;
            b.position = pos;
            balist.push_back(b);
        }
        //开始计算球每个时刻的位置
        list<ball>::iterator bit,tempbit;
        for (int i = 0; i < time; i++) {
            for (bit = balist.begin(); bit != balist.end(); bit++) {
                //判断是否在尽头
                if (bit->position == lineLen || bit->position == 1) {
                    bit->direction = -1;
                }
                //判断是否有球重合
                for (tempbit = balist.begin(); tempbit != balist.end(); tempbit++) {
                    if (bit->id == tempbit->id) {
                        continue;
                    }
                    else {
                        if (bit->position == tempbit->position) {
                            bit->direction = -bit->direction;
                            tempbit->direction = -bit->direction;
                        }
                    }
                }
                //移动球的位置
                bit->position = bit->position + bit->direction;
            }
        }
        //打印球的位置
        for (bit = balist.begin(); bit != balist.end(); bit++) {
            if (bit == balist.begin()) {
                cout << bit->position;
            }
            else {
                cout << " " << bit->position;
            }    
        }
        system("pause");
        return 0;
    }
    唯有热爱方能抵御岁月漫长。
  • 相关阅读:
    C语言I博客作业06
    C语言I博客作业05
    评分标准
    语言I博客作业04
    C语言I博客作业03
    C语言I博客作业02
    C语言I博客作业10
    第十三周助教总结
    C语言I博客作业09
    第十二周助教总结
  • 原文地址:https://www.cnblogs.com/syq816/p/9889735.html
Copyright © 2011-2022 走看看