Python 3.x 如何找到所有可能的方法将图案安装到3×3的网格上?
这有点像一个数学问题,但也有点像一个编码问题,所以我想我会把它贴在这里。我在用蟒蛇3写作 假设有一个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
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矩阵。