两面墙之间有n个小球,初始以每单位时间1单位长度向右运动,当小球撞到墙或者两个小球相撞时,小球向反方向运动,速度不变。(各小球初始位置和墙距均为偶数,不存在三个小球同时碰撞的情况)
要求:
1.第一行输入三个正整数:小球个数n,墙之间的距离L;时间t;
2.第二行输入n个偶数表示小球的起始位置;
3.输出经过t时间后各小球的位置
程序如下:
#include<stdio.h>
#define N 31
int main()
{
int a[N],b[N];
int n,L,t;
int i,j,k,flag=-1;
//对n、L、t进行赋值
scanf("%d%d%d",&n,&L,&t);
//对n个小球的位置进行赋值
for(i=1;i<=n;i++)
{
scanf("%d",&a[i]);
}
//b[i]数组代表n个小球的速度方向,1为向右,-1为向左,初始值为向右
for(i=1;i<=n;i++)
{
b[i]=1;
}
//对t时间的位置进行判断
for(k=1;k<=t;k++)
{
//先判断两端的位置,a[i]为L或者0时,反向
for(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(i=1;i<=n;i++)
{
a[i]=a[i]+b[i];
}
//对距离相等时进行方向的反向操作
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
{
if(i!=j&&a[i]==b[j])
{
//方向反向
b[i]=flag*b[i];
}
}
}
//输出a[i]
for(i=1;i<=n;i++)
{
printf("%d ",a[i]);
}
printf("\n");
return 0;
}
#define N 31
int main()
{
int a[N],b[N];
int n,L,t;
int i,j,k,flag=-1;
//对n、L、t进行赋值
scanf("%d%d%d",&n,&L,&t);
//对n个小球的位置进行赋值
for(i=1;i<=n;i++)
{
scanf("%d",&a[i]);
}
//b[i]数组代表n个小球的速度方向,1为向右,-1为向左,初始值为向右
for(i=1;i<=n;i++)
{
b[i]=1;
}
//对t时间的位置进行判断
for(k=1;k<=t;k++)
{
//先判断两端的位置,a[i]为L或者0时,反向
for(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(i=1;i<=n;i++)
{
a[i]=a[i]+b[i];
}
//对距离相等时进行方向的反向操作
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
{
if(i!=j&&a[i]==b[j])
{
//方向反向
b[i]=flag*b[i];
}
}
}
//输出a[i]
for(i=1;i<=n;i++)
{
printf("%d ",a[i]);
}
printf("\n");
return 0;
}
大致思路:对小球设定一个方向数组b[N],方向辅助变量flag,分析小球反向的两种情况,触底反向和碰撞反向。