假设我们有一个边长为 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 中实现它。