【发布时间】:2016-12-24 21:18:15
【问题描述】:
我正在为一个涉及棋盘游戏 Quarto 的组合问题提供程序解决方案。在 Quarto 中有 16 个片段,每个片段具有四个二进制属性。这意味着我们可以将每个部分表示为一个元组 (i, j, k, l),其中每个元素都是零或一。为了解决我的问题,我需要迭代每一种独特的方式来将 所有 棋子排列在 4x4 棋盘上。我可以做类似的事情
from itertools import permutations
for board_orientation in permutations(pieces, 16):
do_stuff(board_orientation) #takes 1 or 2 full seconds
但这意味着 16! (超过 20 万亿次)迭代。为了避免这种情况,我试图创建一个只产生唯一板方向的生成器——即在一个或多个属性的旋转、反射和反转下唯一的方向(前两个属性由二面角组 D4 描述)。我为Tic-Tac-Toe 找到了一个类似的问题,但我正在努力解决如何将其扩展到这个更复杂的迭代问题。
我认为解决方案涉及通过哈希树将每个板的方向映射到一个数值,然后查看数字在各种对称操作下如何变化,但很难将其转换为代码。
【问题讨论】:
标签: python iteration generator combinatorics