一、题目:
二、解题思路:
- 建立二维数组
a[n][3]
: a[n][0]
用于存储小球位置,a[n][1]
用于存储小球方向(1为正向,-1则相反)a[n][2]
用于存储小球的插入顺序(题目插入是无序的,我们希望小球位置按照从小到大排列,有了插入顺序就不怕排序后输出顺序被打乱)。
代码:
import java.util.Arrays;
import java.util.Comparator;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt(); //读入小球个数
int L = scanner.nextInt(); //读入线段长度
int t = scanner.nextInt(); //读入时间
int[][] a = new int[n][3];
for(int i=0;i<n;i++) {
a[i][0] = scanner.nextInt(); //读入初始位置
a[i][1] = 1; //小球初始都为正向运动
a[i][2] = i+1; //存储插入顺序
}
Arrays.sort(a,new Comparator<int[]>() {
@Override
public int compare(int[] o1, int[] o2) {
return o1[0]-o2[0]; //按照从小到大排列
}
});
for(int i=0;i<t;i++) { //循环t次
for(int j=0;j<n-1;j++) { //遍历1到n-1个小球,防止越界,看后面
a[j][0] +=a[j][1]; //每个小球移动一个单位
}
if(a[n-1][0]==L) { //判断最后一个小球是否到右端点
a[n-1][1] = -1; //改变移动方向
}
a[n-1][0] +=a[n-1][1]; //最后一个小球移动一个单位
for(int j =0;j<n-1;j++) { //遍历是否有小球相撞
if(a[j][0]==a[j+1][0]) {
a[j][1] = -1; //调整两球方向为反方向
a[j+1][1] = 1;
}
if(a[n-2][0]==a[n-1][0]) { //判断倒数第1、2球是否相撞
a[n-2][1] = -1;
a[n-1][1] = 1;
}
if(a[0][0]==0) { //判断第一个球是否达到左端点
a[0][1]=1;
}
}
}
Arrays.sort(a,new Comparator<int[]>() {
@Override
public int compare(int[] o1, int[] o2) {
return o1[2]-o2[2]; //按照插入顺序排序
}
});
for(int i =0;i<n;i++) {
System.out.print(a[i][0] + " ");
}
}
}
欢迎讨论~