【发布时间】:2013-06-10 13:37:43
【问题描述】:
假设我们有一个边长为 S 的正方形,以及 N 个长度为 X 和宽度为 Y 的矩形瓷砖的副本。程序必须显示这些副本可以在网格中排列的所有方式,以便 没有两个副本可以相互接触。
通过显示,我的意思是它必须显示网格中每个副本的左上角坐标集。
我尝试了以下方式:
-
找到一个基本案例,我尝试将每个副本以 1 个正方形分隔。 例如,对于 6x6 网格上的 1x2 瓦片的 6 个副本,基本情况是
xx_xx_ ______ xx_xx_ ______ xx_xx_ ______ 将最后一个图块移动到可能的位置。
将最后一个图块返回到基本情况,将最后一个图块之前的图块移动到可能的位置。重复步骤 2。
对每个图块都重复一遍。
基本上问题是我找不到行号或列号之差为 1 但它们不相互接触的情况。例如,我找不到这种情况:
xx____ This tile
___xx_ and this one has a difference in row numbers 1.
xx____
___xx_
xx____
___xx_
你能提出一些建议吗?或者更有效的算法?
注意:我尝试在 Prolog 中实现它。
【问题讨论】:
-
矩形可以垂直吗?
-
不,要垂直放置,必须交换宽度和长度
-
当您将正方形和矩形扩展一排(底部)和一列(右侧)时,即有一个
(S+1)正方形和N个尺寸为(X+1)x(Y+1)的矩形,然后“不接触”条件转化为“不重叠”。这应该更容易实现。
标签: algorithm