【问题标题】:How to find all possible ways to fit a pattern onto a 3 by 3 grid? [closed]如何找到所有可能的方法将图案适合 3 x 3 网格? [关闭]
【发布时间】:2021-03-13 09:40:04
【问题描述】:

这有点像数学问题,但也有点像编码问题,所以我想我会把它贴在这里。我正在用python3编写。

假设您有一个 3 x 3 的网格:

O O O
O O O
O O O

现在我有一个模式,例如A B。我想找到将这种模式放置到 3x3 网格上的所有方法。不允许旋转。对于这个特定示例,所有解决方案都是:

A B O | O A B | O O O | O O O | O O O | O O O
O O O | O O O | A B O | O A B | O O O | O O O
O O O | O O O | O O O | O O O | A B O | O A B

图案可以有从 1x2/2x1 到 3x3 的任何尺寸。我不能完全围绕制定一个可以做到这一点的算法。 A 和 B 之类的键可能会出现 1 到 9 次,我不知道它们有什么名字。

【问题讨论】:

  • 您的示例的工作方式只是在网格行上循环 - height(pattern) + 1,然后在网格列上循环 - len(pattern) + 1
  • 在这个可以工作的具体示例中,但我也可能有 2x3 或 2x2 模式。甚至是 3*3 模式,其中有空槽

标签: python-3.x algorithm pattern-matching


【解决方案1】:

这是我在原始问题的评论中草拟的解决方案:

import copy

def format(grids):
    lines = []
    for i in range(len(grids[0])):
        line = []
        for g in grids:
            line.append(" ".join(g[i]))
        lines.append(" | ".join(line))
    return "\n".join(lines)

def placement(grid, gi, gj, pattern):
    grid2 = copy.deepcopy(grid)
    for pi in range(len(pattern)):
        for pj in range(len(pattern[0])):
            grid2[gi + pi][gj + pj] = pattern[pi][pj]
    return grid2

def placements(grid, pattern):
    results = []
    for i in range(len(grid) - len(pattern) + 1):
        for j in range(len(grid[0]) - len(pattern[0]) + 1):
            results.append(placement(grid, i, j, pattern))
    return results

grid = [
        ['O'] * 3, 
        ['O'] * 3, 
        ['O'] * 3
]
pattern = [
        ['A', 'B']
]
print(format(placements(grid, pattern)))

结果是:

A B O | O A B | O O O | O O O | O O O | O O O
O O O | O O O | A B O | O A B | O O O | O O O
O O O | O O O | O O O | O O O | A B O | O A B

【讨论】:

  • 就像我的评论所说的placements 会遍历模式适合的每一行和每一列。 placement 将给定位置的图案“标记”到网格上。最后,format 生成您为所有解决方案显示的结果格式。
  • 你说图案可能有洞。唯一会改变的是placement,如果 pattern[pi][pj] 不是一个洞,你只做 grid2 分配。对孔使用魔术符号是有意义的,但仍然让模式为 n * m 矩阵。
猜你喜欢
  • 2021-02-14
  • 1970-01-01
  • 2021-07-14
  • 1970-01-01
  • 2015-11-07
  • 1970-01-01
  • 2020-05-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多