18-03-02(碰撞的小球)

思路:
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

おすすめ

転載: blog.csdn.net/qq_51985653/article/details/121060374
03