CCF 碰撞的小球(满分代码 + 解题思路)201803-2

题目描述

在这里插入图片描述


解题思路

题意就是一群小球在线段上运动,给出球的初始位置和运动方向,问在t时间后小球的位置
小球只会有两种行为,一种是移动,一种是反向
当与别的小球碰撞时,会反向,所以要判断两个小球是否会碰撞
判断两个小球是否会碰撞,那么就要知道此时刻小球所在的位置,所以可以根据时间来依次移动小球
每一秒,移动过后,判断该小球是否与前面已经移动过的小球相撞,若是,两球反向
还需注意,移动过程中,超出线段范围需要反向

代码实现

#include <iostream>
#include <cstring>
#include <algorithm>

using namespace std;

const int N = 110;

int a[N]; //存储当前小球所在位置
bool dir[N]; //false代表正方向

int main()
{
    int n, L, t;
    cin >> n >> L >> t;

    for (int i = 0; i < n; i ++)
    {
        cin >> a[i];
    }

    while (t --)
    {
        for (int i = 0; i < n; i ++)
        {
            //根据运动方向运动一格
            if (dir[i]) a[i] --;
            else a[i] ++;
            
            //如果超出了线段,纠正位置,并改变方向
            if (a[i] > L)
            {
                a[i] = L - 1;
                dir[i] = !dir[i];
            }
            if (a[i] < 0)
            {
                a[i] = 1;
                dir[i] = !dir[i];
            }
            
            //如果此时的位置与已经运动过的小球碰撞,那么两个小球都反向
            for (int j = 0; j < i; j ++)
            {
                if (a[i] == a[j])
                {
                    dir[i] = !dir[i];
                    dir[j] = !dir[j];
                    break; //不会出现三个小球的碰撞
                }
            }
        }
    }

    for (int i = 0; i < n; i ++)
    {
        cout << a[i] << " ";
    }
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一只可爱的小猴子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值