问题描述
  数轴上有一条长度为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 = ; i <= ballcount; i++) {
cin >> pos;
ball b;
b.id = i;
b.direction = ;
b.position = pos;
balist.push_back(b);
}
//开始计算球每个时刻的位置
list<ball>::iterator bit,tempbit;
for (int i = ; i < time; i++) {
for (bit = balist.begin(); bit != balist.end(); bit++) {
//判断是否在尽头
if (bit->position == lineLen || bit->position == ) {
bit->direction = -;
}
//判断是否有球重合
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 ;
}

CCF认证201803-2 碰撞的小球 java代码实现。的更多相关文章

  1. 201803-2 碰撞的小球 Java

    思路: 直接按照题意模拟,感觉没什么太好的办法.另外注意:int这种基础数据类型不能用equals这个方法 ,必须是Integer类型 import java.util.Scanner; public ...

  2. CCF CSP 201803-2 碰撞的小球

    题目链接:http://118.190.20.162/view.page?gpid=T72 问题描述 数轴上有一条长度为L(L为偶数)的线段,左端点在原点,右端点在坐标L处.有n个不计体积的小球在线段 ...

  3. 碰撞的小球 ccf (模拟)

    问题描述 试题编号: 201803-2 试题名称: 碰撞的小球 时间限制: 1.0s 内存限制: 256.0MB 问题描述: 问题描述 数轴上有一条长度为L(L为偶数)的线段,左端点在原点,右端点在坐 ...

  4. ccf认证 201709-4 通信网络 java实现

    试题编号:                                                               201709-4 试题名称: 通信网络 时间限制: 1.0s 内 ...

  5. CCF认证历年试题

    CCF认证历年试题 不加索引整理会死星人orz 第一题: CCF201712-1 最小差值(100分) CCF201709-1 打酱油(100分) CCF201703-1 分蛋糕(100分) CCF2 ...

  6. CCF-201803-2 碰撞的小球

    问题描述 数轴上有一条长度为L(L为偶数)的线段,左端点在原点,右端点在坐标L处.有n个不计体积的小球在线段上,开始时所有的小球都处在偶数坐标上,速度方向向右,速度大小为1单位长度每秒.当小球到达线段 ...

  7. 【web前端学习部落22群】分享 碰撞的小球开源小案例

    对于课程中的疑问,大家可以加 web前端学习部落22群 120342833和其他老师还有众多的小伙伴们进行沟通交流哦,群里还有不少技术大拿.行业大牛 可以一起探讨问题,我们也会安排专业的技术老师为大家 ...

  8. 小明种苹果(续)第十七次CCF认证

    小明种苹果(续)第十七次CCF认证 题目 原题链接 ](http://118.190.20.162/view.page?gpid=T93) 很高心,在现在CCF CSP可以下载自己当时的答卷了,也就是 ...

  9. 【C++】CCFCSP201803-2碰撞的小球

    // // main.cpp // CCFCSP20180318_2_碰撞的小球 // // Created by T.P on 2018/3/24. // Copyright © 2018年 T.P ...

随机推荐

  1. python查看当前路径

    1.os模块 import os print os.getcwd() #获取当前工作目录路径 print os.path.abspath('.') #获取当前工作目录路径 print os.path. ...

  2. UOJ450. 【集训队作业2018】复读机

    传送门 \(d=1\) 输出 \(k^n\) \(d=2\),构造生成函数,就是求 \[(\sum_{i=0}^{\infty}[2|i]\frac{x^i}{i!})^k[x^n]=(\frac{e ...

  3. JS 写入到文件

    //js写文件 function doSave(value, type, name) { var blob; if (typeof window.Blob == "function" ...

  4. Breakpoint debugging

    断点调试的作用: A:查看程序的执行流程. B:调试程序. package basic.java; public class DebugTest { public static void main(S ...

  5. Fragment初探

    Fragment允许将Activity拆分成多个完全独立封装的可重用的组件,每个组件有它自己的生命周期和UI布局.Fragment最大的优点是为不同屏幕大小创建灵活的UI.每个Fragment都是独立 ...

  6. HTTP状态码和HTTP请求头

    HTTP报文是在Web服务器和浏览器之间进行交换的文本数据,一种是从浏览器发出的请求,一种是服务器发出的响应. 请求报文的第一行包括:1.请求方法 2.当前使用的HTTP协议版本 3.请求地址 GET ...

  7. 读<css世界>笔记之img标签

    Web开发时,为了节约带宽以及提高加载性能,首屏以下的图片就会通过滚屏加载的方式异步加载,然后这个即将被异步加载的图片为了布局稳健,体验良好,往往会使用一张透明的图片占位,如: <img src ...

  8. Spring中的转换器:Converter

    配置spring的配置文件: <bean id="conversionService" class="org.springframework.context.sup ...

  9. Mycat中间件

    数据库中间件Mycat自我介绍 一.mycat概述 1.功能介绍 mycat一个开源的分布式数据库系统,是一个实现了mysql协议的server前端用户可以把它看成一个数据库代理,用mysql客户端工 ...

  10. python字典的排序

    # -*- coding:UTF-8 -*- def dict_sort(): # 按照value的值从大到小的顺序进行排序 dic = {'a': 31, 'bc': 5, 'c': 3, 'asd ...