两面墙之间有n个小球,初始以每单位时间1单位长度向右运动,当小球撞到墙或者两个小球相撞时,小球向反方向运动,速度不变。(各小球初始位置和墙距均为偶数,不存在三个小球同时碰撞的情况)
要求:
1.第一行输入三个正整数:小球个数n,墙之间的距离L;时间t;
2.第二行输入n个偶数表示小球的起始位置;
3.输出经过t时间后各小球的位置
程序如下:
import java.util.Scanner;
class LittleBall
{
private static Scanner sc;
public static void main(String[] args)
{
final int N = 31;
int[] a = new int[N];
int[] b = new int[N];
int flag=-1;
sc = new Scanner(System.in);
//对n、L、t进行赋值
int n = sc.nextInt(); int L = sc.nextInt(); int t = sc.nextInt();
for(int i=1;i<=n;i++)
{
a[i] = sc.nextInt();
}
for(int i=1;i<=n;i++)
{
b[i]=1;
}
//对t时间的位置进行判断
for(int k=1;k<=t;k++)
{
//先判断两端的位置,a[i]为L或者0时,反向
for(int i=1;i<=n;i++)
{
if((a[i]==L&&b[i]==1)||(a[i]==0&&b[i]==-1))
{
//仅对方向进行调整
b[i]=flag*b[i];
}
}
//每经过1秒a[i]进行一次运算
for(int i=1;i<=n;i++)
{
a[i]=a[i]+b[i];
}
//对距离相等时进行方向的反向操作
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
{
if(i!=j&&a[i]==a[j])
{
//方向反向
b[i]=flag*b[i];
}
}
}
//输出a[i]
for(int i=1;i<=n;i++)
{
System.out.print(a[i]+" ");
}
}
}
大致思路:对小球设定一个方向数组b[N],方向辅助变量flag,分析小球反向的两种情况,触底反向和碰撞反向。