思路:
1.先对小球按照初始位置从大到小进行排序;
2.按照时间进行移动:每次移动一个位置,每次移动完成就进行方向判断
3.如果位置重合则方向改变(题目的设计为我们简化了很多问题,只会有两个小球相撞):该小球与后一个小球相撞(我追他)、该小球与前一个小球相撞(他追我)
4.依照时间遍历完成之后,将小球编号和位置匹配恢复到原来的位置
5.输出结果
import java.util.*;
public class csp_18_03_02{
public static void main(String[] args){
Scanner input = new Scanner(System.in);
int n = input.nextInt();
int L = input.nextInt();
int t = input.nextInt();
int[][] ball = new int[n][2];
int[] index = new int[n];
for(int i =0;i<n;i++){
ball[i][0] = input.nextInt();//位置
ball[i][1] = 1;//方向
index[i] = i;
}
for(int i =0;i<n-1;i++){
for(int j =i+1;j<n;j++){
if(ball[i][0] > ball[j][0]){
int temp = ball[i][0];
ball[i][0] = ball[j][0];
ball[j][0] = temp;
int p = index[i];
index[i] = index[j];
index[j] = p;
}
}
}//for
for(int i =0;i<t;i++){
move(ball);
change(ball,L);
}
for(int i =0;i<n-1;i++){
for(int j =i+1;j<n;j++){
if(index[i] > index[j]){
int temp = ball[i][0];
ball[i][0] = ball[j][0];
ball[j][0] = temp;
int p = index[i];
index[i] = index[j];
index[j] = p;
}
}
}//for
for(int i =0;i<n;i++){
System.out.print(ball[i][0]+" ");
}
}//main
public static void move(int[][] ball){
int n = ball.length;
for(int i =0;i<n;i++){
if(ball[i][1] >0)
ball[i][0] += 1;
else
ball[i][0] -= 1;
}
}//move
public static void change(int[][] ball,int L){
int n = ball.length;
for(int i =0;i<n;i++){
if(ball[i][0] == L){
ball[i][1] = -1;
}
if(ball[i][0] == 0){
ball[i][1] = 1;
}
if(i>=1 && ball[i][0]==ball[i-1][0]){
ball[i][1] = 1;
ball[i-1][1] = -1;
}
if(i<n-1 && ball[i][0]==ball[i+1][0]){
ball[i][1] = -1;
ball[i+1][1] = -1;
}
}//for
}//change
}//Main