如何找到所有可能的方法来将模式拟合到 3 x 3 网格上?

问题描述

这有点像数学问题,但也有点像编码问题,所以我想把它贴在这里。我是用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 次,但我不知道它们的名称

解决方法

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

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