问题描述
这有点像数学问题,但也有点像编码问题,所以我想把它贴在这里。我是用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