Python 3.x 如何找到所有可能的方法将图案安装到3×3的网格上?

Python 3.x 如何找到所有可能的方法将图案安装到3×3的网格上?,python-3.x,algorithm,pattern-matching,Python 3.x,Algorithm,Pattern Matching,这有点像一个数学问题,但也有点像一个编码问题,所以我想我会把它贴在这里。我在用蟒蛇3写作 假设有一个3乘3的网格: O O O O O O O O O 现在我有了一个模式,例如ab。我想找到所有方法将此图案放置在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

这有点像一个数学问题,但也有点像一个编码问题,所以我想我会把它贴在这里。我在用蟒蛇3写作

假设有一个3乘3的网格:

O O O
O O O
O O O
现在我有了一个模式,例如
ab
。我想找到所有方法将此图案放置在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

您的示例的工作方式只是在网格行上循环-高度(模式)+1,这反过来又在网格列上循环-len(模式)+1在这个特定示例中可以工作,但我可能也有2x3或2x2模式。甚至3*3个模式中有空槽,就像我的评论所说的
placements
在模式适合的每一行和每一列上迭代<代码>放置将给定位置的图案“标记”到网格上。最后,
格式
生成您为所有解决方案显示的结果格式。您说该模式可能有漏洞。唯一会改变的是
placement
,如果模式[pi][pj]不是孔,则只执行grid2赋值。在孔中使用魔法符号是有意义的,但仍然让图案为n*m矩阵。