将巧克力棒分成相等部分的算法

时间:2009-05-13 19:27:34

标签: algorithm geometry 2d

一个随意的想法突然出现在我脑海中(当然,当我分享巧克力棒的时候!)。我想知道是否有一个通用算法来解决这个问题。

问题是这样的:

信息

你有一个巧克力棒,小方块排列成矩形矩阵 2.房间里有n个人

问题

编写一个算法,输出最佳配置(p x q),在n, n-1, n-2...., 2, 1人之间可以平均分配条形,但有以下限制:

1.小方块(单位正方形)不能切成小块2。所有断裂必须完全沿着一个轴完成。中断的总数不能超过n(这是为了阻止低效的解决方案,例如试图将整个条分成小块并分割小块)。 p或q不能等于1. yx在其中一个答案中指出,如果一方有1条,问题很容易解决。然而,这对于现实世界的情况来说不是一个好的解决方案 - 这是解决这个问题的意图:)

示例

对于n = 4,最佳配置为4 x 3.

 ~~~~ ~~~~ ~~~~ ~~~~
|    |    |    |    |
 ~~~~ ~~~~ ~~~~ ~~~~
|    |    |    |    |
 ~~~~ ~~~~ ~~~~ ~~~~
|    |    |    |    |
 ~~~~ ~~~~ ~~~~ ~~~~

这种配置可以分为:
左右4个沿纵轴断裂的人4人3个沿水平轴断2个人2个右1个断裂其他经验解决方案是(n, p, q) = (1, 1, 1); (2, 2, 1); (3, 3, 2); (4, 4, 3); (5, 5, 12); (6, 6, 10) OR (6, 5, 12)

澄清中断被定义为沿一个轴的切割对于条的子集,如果适用的话。为了更好地说明这一点,假设你有一个像这样的2 x 2巧克力棒:

 ~~~~ ~~~~
|    |    |
 ~~~~ ~~~~
|    |    |
 ~~~~ ~~~~

传统智慧说你需要做2次断裂(中间向下和横向的垂直轴)将这个条分成4个。然而,在现实世界中(如果它是巧克力棒),你首先将它分成两半,然后再分别打破每一半。这总共有3次休息 - 整个酒吧有1次休息,酒吧的2个不同子组有2次休息。

我无法在互联网上的任何地方找到解决方案 - 如果有人觉得这是不是编程相关的问题或解决方案已经存在,随时关闭问题=)

3 个答案:

答案 0 :(得分:8)

在我看来,你正在寻找可以在1和n之间的所有数字均匀分割的数字。这被称为1,...,n的最小公倍数。根据定义,包含1,...,n个正方形的最小公倍数的正方形可以均匀地分成尺寸为1,...,n的块。您正在寻找最多n个分裂,这会增加问题的复杂性,这可能是也可能是不可能的。

你的n = 4的例子是LCM(4,3,2,1),即12。LCM(5,4,3,2,1)是60. LCM(6,5,4,3, 2,1)也是60岁。

它们总是可以布局为1xLCM(n,...,1)矩形,并且在n-1或更少的分区中始终可分为1,...,n偶数堆。

例如,当n = 4时,LCM(4,3,2,1)= 12.矩形为

############

可分为以下几种:

1: ############     // 0 cuts
2: ###### ######    // 1 cut
3: #### #### ####   // 2 cuts
4: ### ### ### ###  // 3 cuts (3 being n-1)

答案 1 :(得分:3)

由于你不能一次切割多个棋子,对于你想要的任何数量的棋子m(1..n),你总是需要m-1切割。每个剪辑创作一件,你从一件作品开始。

在之前的解决方案的基础上,我认为您正在直观地寻找以下算法:

A = LCM(n)
p = greatest divisor of A <= sqrt(A)
q = A/p

这个算法应该是微不足道的(例如从p = floor(sqrt(A)开始)并向下计数直到mod(A,p)== 0)。

您希望sqrt的原因是限制您检查的数字量。毕竟,你总是有一个除数&lt; = sqrt(A)和一个&gt; = sqrt(A)

答案 2 :(得分:1)

回答这个问题的一个好方法是使用广度优先搜索算法。该算法将尝试整个巧克力棒的每一个可能的中断。然后针对问题的每个可能状态,尝试所有可能的中断,这将继续,同时跟踪碎片的均匀性。

我想补充一点,规则会强制执行巧克力条的哪些合法,以及那些不合法的可能状态会从算法中抛弃。