我正在研究涉及棋盘游戏Quarto的组合问题的编程解决方案。在Quarto中有十六件,每件都有四个二元属性。这意味着我们可以将每个元素表示为一个元组(i,j,k,l),其中每个元素为零或一个元素。为了解决我的问题,我需要重复每种独特的方式,以便在4x4的棋盘上安排全部棋子。我可以做类似Python迭代器Quarto游戏板的独特安排
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的一个类似问题,但我在如何将它扩展到这个更复杂的迭代问题上挣扎。
我认为解决方案涉及通过散列树将每个板子方向映射到数值,然后看看数字在各种对称操作下如何变化,但努力将其转换为代码。