【问题标题】:Number of ways N circles of different radius can be arranged in a lineN个不同半径的圆可以排成一条直线的方式数
【发布时间】:2017-01-15 13:09:36
【问题描述】:

问题:给定直线上的 M 个点,间隔为 11 个单位。找出可以绘制 N 个不同半径的圆的方法的数量,以使它们不相交或重叠或彼此相交?前提是圆心应该是那些MM点。

示例 1:N=3,M=6,r1=1,r2=1,r3=1 答案:24 种方式。

示例 2:N=2,M=5 ,r1=1,r2=2 答案:6 种方式。

示例 3:N=1,M=10,r=50。答案 = 10 种方式。

我在网上找到了这个问题,直到现在都无法解决。到现在为止,我只能计算出任何圆可以占用从 n-rn-r 到 n-2rn-2r 的空间。但是在其他问题中,我如何调整半径为 33 的圆取第 n−4n−4 个点的边缘情况,现在最后一个点将保持不变,但我不能放置任何半径大于 1 的圆。我不是能够看到任何对此的广义数学解决方案。

【问题讨论】:

  • 你的意思是 1 个单位吗?
  • 只是简单的回溯?

标签: algorithm combinatorics


【解决方案1】:

如果圆心可以放在非整数 x 和 y 坐标上,那么要么由于长度太短而不可能,要么由于长度足够而无限多且平移无限多。

因此,由于您必须计算结果,我将假设 (M,M) 的坐标是整数。

如果只有一个圆,则解决方案是该圆可以合法放置的点数。

如果至少有两个圆,那么你需要计算直径的总和,如果它恰好大于我们所说的线的总长度,那么你就没有解决方案。如果不是这种情况,那么您需要从总长度中减去直径之和,得到 Complementer。你也有N!排列来计算圆的顺序。您将拥有 Complementer - 1 个可能的位置,您可以在其中分布圆圈之间的间隙。间隙的长度为 G1, ..., Gn-1

我们知道 G1 + ... + Gn-1 = Complementer

G1, ..., Gn-1 的可能分布数为 D。因此公式为 b

N! * D

剩下的问题是:我们如何计算 D?

解决方案:

function distr(depth, maxDepth, amount)
    if (depth = maxDepth) then
        return 1 //we need to put the remaining elements on the last slot
    end if
    sum = 1 //if we put amount here, that is a trivial case
    for i = amount - 1 to 0 do
        sum = distr(depth + 1, maxDepth, amount - i)
    end for
    return sum
end distr

您需要使用 depth = 1、maxDepth = N-1、amout = Complementer 调用 distr

【讨论】:

  • 我想我可能没有正确传达这个想法。看例子3。有10个点,只有一个圆,所以你可以把圆放在10个不同的点上。如果你是第一个或最后一个,那么超过总值的直径无关紧要
  • @ambikeyasangwan 该案例实际上已在此答案中处理。引用:“如果只有一个圆,那么解决方案是圆可以合法放置的点数。”
  • 你能多解释一下互补者吗?
  • @ambikeyasangwan 是的,当然。我将 Complementer 命名为可以放置圆圈的未填充合法点的数量。例如,如果您有 11 个点,但直径之和为 5,那么您将有 6 个未使用的插槽,您需要计算组合这些插槽的方式数。我已经为此描述了一种称为 distr 的算法。我很确定我可以为此给出一个公式,但我现在没有足够的时间去做。
  • 另外,不会吧!太大而计算机无法处理?我的意思是大约 100 左右的值可能超出了 long 的范围。有没有计算更友好的版本?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-25
  • 2011-01-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多