CCF认证2018年3月份 第2道 小球碰撞-C语言编程解析

 

两面墙之间有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]==a[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,分析小球反向的两种情况,触底反向和碰撞反向。

 

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值