python - 如何用 2 * 3 block 占据 10 x 10 block ,并且不让其他人推另一个 2 * 3 block

标签 python algorithm

我想找出可以填充 100 个像素的 2 * 3 block 的最小数量,并且不允许填充任何其他 2 * 3 block ,如下图所示。

2 * 3 in 10 * 10 = 6

enter image description here

或者另一个例子:

2 * 1 in 5 * 7 = 14

enter image description here

我进行了很多搜索,但到目前为止还没有成功。我不需要任何代码,但我想要算法名称或任何建议来找到我的方法。

任何帮助将不胜感激。

最佳答案

从评论中我了解到,我们无法旋转矩形。那么我们就采用下面的方法:

想象一下,您想要解决同样的问题,但仅限于直线,其中矩形大小为 1xGridW 网格中的 1xRectW。

我将使用“X”表示矩形单元格,“0”表示空单元格。 示例有 1x3 矩形和 1x10 网格。

从左侧,我可以保留最大的空(RectW - 1)单元格:

00XXX00000

然后我可以在前一个矩形的右侧最多留出空的(RectW - 1)单元格:

00XXX00XXX

现在我们添加另一个维度。假设我们有 2 行。我可以在这里继续使用相同的逻辑,但我将复制整个第一行,而不是复制矩形:

00XXX00XXX
00XXX00XXX

现在我们想对 10x11 网格中的 2x4 矩形执行相同的操作。这里我们得到了高度为 2 的矩形,因此第一步将使用 2 行:

000XXXXXXXX
000XXXXXXXX

并将其扩展为行:

00000000000
000XXXXXXXX
000XXXXXXXX
00000000000
000XXXXXXXX
000XXXXXXXX
00000000000
000XXXXXXXX
000XXXXXXXX
00000000000

正如您所注意到的,我们在顶部添加了额外的 (RectH - 1)。

如果你注意的话,你会发现,实际上我们只是在进行除法和四舍五入。

所以在Python中我们可以用这样的数学抽象来表达这个想法:

def solver(rectH, rectW, gridH, gridW) -> int:
    w = round(gridW / (rectW * 2 - 1))
    h = round(gridH / (rectH * 2 - 1))
    return w * h

结果:

>>> solver(2, 3, 10, 10)
6
>>> solver(2, 1, 5, 7)
14

关于python - 如何用 2 * 3 block 占据 10 x 10 block ,并且不让其他人推另一个 2 * 3 block ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72908870/

相关文章:

python - 如何判断 Python 模块是否是命名空间模块

Python - 发送 "Incomplete"GET 请求

python - 配置 django ec2 实例以使用 virtualenv

c++ - 处理条件语句

c++ - 重复字母和连续字母不相同的排列

python - 来自 Tkinter.Button 的命令

python - 将函数应用/组合 N 次到 Pandas 列,每行 N 不同

mysql - 如何根据多个条件来决定/查询数据

performance - 查找给定范围内大于给定数字的最小元素

algorithm - 如何拆分图以最小化最长路径的长度