欢迎访问我的CCF认证解题目录
题目描述
思路过程
- 新建一个类来存放小球的信息,num表示小球的位置,move表示移动的距离,相撞时用move = move * -1来改变方向。
- 新建一个标记数组,长度为l+1,用来表示位置上有多少个球,以用来判断是否相撞,左边界和右边界初始值为2。
- 开一个for循环来走时间,每一轮都重置标记数组,先移动,后判断是否相撞
代码
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int n = in.nextInt(), l = in.nextInt(), t = in.nextInt();
Node[] nodes = new Node[n];//小球
int[] flags = new int[l+1];//表示一个位置有多少个小球,如果>1,则是相撞了
for ( int i = 0; i < nodes.length; i++ ) nodes[i] = new Node(in.nextInt(), 1);
for ( int i = 0; i < t; i++ ) {
Arrays.fill(flags, 0);//重新填充为0
flags[0] = 2;//左边界
flags[l] = 2;//右边界
for ( Node node: nodes ) {//移动
node.num += node.move;
flags[node.num] += 1;
}
for ( Node node: nodes ) {
if ( flags[node.num] > 1 ) node.move *= -1;//相撞
}
}
for ( Node node: nodes ) System.out.print(node.num+" ");
}
}
class Node {
int num, move;//位置和移动
public Node(int num, int move) {
this.num = num;
this.move = move;
}
}