滚动的小球问题c++

该博客探讨了一个在光滑平板上的滚动小球问题,其中小球按速度每秒移动一个单位长度,并在碰撞时改变方向。作者指出,解决这个问题的关键在于理解小球的最终运动方向和时间仅与其初始位置和方向有关。通过将碰撞事件抽象化,可以简化问题,直接寻找平板上滚动时间最长的小球,从而得到最后一个小球掉落的时间。
摘要由CSDN通过智能技术生成

问题描述

在一个长为N的光滑平板上,有若干个光滑小球分布在平板的整数点上,比如0,1,2,....N,然后给定初始向左移动的小球工个,初始向右移动的小球R个,接下来给定向左移动的每个小球的初始位置和向右移动的每个小球的初始位置。保证小球的速度始终为每秒一个单位长度,当两个方向不同的小球相撞时,它们同时改变运动方向并继续运动(相撞瞬间完成,不消耗时间)。请求解最后一个小球从平板掉下来的时间。初始时刻t=0,即求解最后一个小球掉下去的t的值。(如果端点处小球一开始就向木板外滚动,那么它的掉落时刻为t=0 )

 

很多人刚开始看题的时候,就会感到十分困惑,因为所给的小球由于方向不同,有的之间会形成碰撞改变方向,那么又得重新改变方向进行运动,如何能够每秒都能进行位置的重新更新呢?我一开始也是这么想的。但是后来发现是我想多了。我们其实可以发现,小球其实运动的方向和时间仅仅和开始的方向和位置有关。这是为什么呢?

简单的举一个例子,如果有两个小球A、B 分别在0 2 位置,当二者碰撞时应该是在1位置,当碰撞发生之后,二者要改变方向继续运动。但是我们可以把它们的模型分别抽离出来,认为它们没有发生碰撞,而是继续朝着开始的方向进行运动。而事实上这两者确实是等价的关系。这样我们的问题就得到了简化:从必须找到时时刻刻更新每个小球位置,到最后一个小球掉落

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
小球摆放问题是一个经典的组合问题,可以使用递归的方法来解决。以下是使用 C 语言编写的一个解决小球摆放问题的程序: ```c #include <stdio.h> // 摆放小球的递归函数 int placeBalls(int n, int m) { if (n < 1 || m < 1) { // 如果 n 或 m 小于 1,则返回 0 return 0; } if (n == 1 || m == 1) { // 如果 n 或 m 等于 1,则返回 1 return 1; } if (n < m) { // 如果 n 小于 m,则交换 n 和 m 的值 int temp = n; n = m; m = temp; } // 递归调用 return placeBalls(n - m, m) + placeBalls(n, m - 1); } int main() { int n, m; printf("请输入小球的个数:"); scanf("%d", &n); printf("请输入篮子的个数:"); scanf("%d", &m); int result = placeBalls(n, m); printf("小球摆放方案数为:%d\n", result); return 0; } ``` 在上面的程序中,我们定义了一个 `placeBalls` 函数,它接受两个参数 `n` 和 `m`,分别表示小球的个数和篮子的个数。该函数通过递归的方式来计算小球的摆放方案数。 在递归调用时,我们有以下三种情况: - 当 n 或 m 小于 1 时,返回 0,因为此时没有可摆放的小球或篮子。 - 当 n 或 m 等于 1 时,返回 1,因为此时只有一种摆放方案,即所有小球都放在一个篮子中。 - 当 n 大于 m 时,将 n 和 m 的值交换,使得 m 始终表示篮子的个数。然后,递归调用 `placeBalls(n - m, m)` 和 `placeBalls(n, m - 1)`,分别表示将 n 个小球放在 m - 1 个篮子中和将 n - m 个小球放在 m 个篮子中的方案数。最终的方案数即为这两个值的和。 在 `main` 函数中,我们首先从用户输入中获取小球的个数和篮子的个数,然后调用 `placeBalls` 函数来计算摆放方案数,并将结果输出到控制台中。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值