【发布时间】:2013-03-20 06:11:53
【问题描述】:
下面是一个奇怪的问题:
我正在我的学校举办解决问题的比赛,他们允许我们使用电脑。因为我是比赛中唯一知道如何编码的人,所以我使用 C 和 Pascal 程序来更快地解决问题。我已经通过伪代码到代码的练习、算法、Collatz 猜想验证等来做到这一点。
现在,昨天我正在为下一个挑战(4 月 18 日)进行训练,我看到了一个关于 Young 画面的练习。措辞是这样的(我会尽力从意大利语翻译):
“费雷尔图是分布在一个或多个水平行中的 N 个框的配置,左对齐并配置为使每一行包含的框数与其上的行相同或更少。这些配置也可以通过以下列表来描述盒子的编号,如下图所示:
(来源:olimpiadiproblemsolving.it)
Young 画面是由 N 个盒子组成的 Ferrers 图,其中填充了从 1 到 N 的整数。示例:
(来源:olimpiadiproblemsolving.it)
如果框中的数字按行和列按升序排序,则该表是“标准”表(例如:第一、第三和第五表)。在标准表格中,第一行的第一个框始终包含 1。N 始终位于图表其中一行的最左边的框中。
问题
考虑一个 [6,3,2,1,1,1] 费雷尔图:
1) 如果第 1 行第 6 个盒子上固定 6,第 1 列最后一个盒子上固定 11,你可以用几种方式完成标准的图表?
2) 如果 7 固定在第 1 行的第 6 个盒子上,而 11 固定在第 1 列的最后一个盒子上,你有几种方法可以以标准的方式完成图表?
3) 如果第 1 行第 6 个盒子上固定 8,第 1 列最后一个盒子上固定 11,你有多少种方式可以用标准方式完成图表?"
我试图用一个填充了这些数字的矩阵和“-1”作为“行结束字符”来编写一个解决方案,但我被卡住了。我如何编码“以各种可能的方式填充它,以便画面是标准的?”。
【问题讨论】:
-
为此,我认为 Prolog 是比 C 更好的工具选择。
-
很久没看到这么好的问题了。在这里,投下我今天的最后一票。
-
嗯...Prolog 是什么?
-
想一想如何在不实际生成解决方案的情况下计算填充方法的数量。动态编程、记忆和递归将成为你的朋友。由于其他竞争对手没有使用程序,因此必须有一个不涉及大量计算的解决方案。好问题!
-
绘制画面时,我注意到如果我将绘制它的纸张顺时针旋转 90°,它看起来是一样的。此外,在第一列中,除了 1,6 和 11 之外,可以有 1 到 11 之间的任何数字,在第一行中,除了 1 和 6 之外,可以有 1 到 6 之间的任何数字。并且有 14 个框,因此 N=14。嗯。
标签: c prolog diagram constraint-programming clpfd