想象一个 3x3 的网格:
[A, B, %]
[C, %, D]
[E, F, G]
百分比%
代表空白/位置。
这些行可以像串上的珠子一样移动,这样第一行的配置排列可以是以下任何一个:
[A, B, %] or [A, %, B] or [%, A, B]
第二行也是如此。第三行不包含空槽,因此无法更改。
考虑到每一行的可能排列,我正在尝试生成所有可能的网格。
输出应产生以下网格:
[A, B, %] [A, B, %] [A, B, %]
[C, D, %] [C, %, D] [%, C, D]
[E, F, G] [E, F, G] [E, F, G]
[A, %, B] [A, %, B] [A, %, B]
[C, D, %] [C, %, D] [%, C, D]
[E, F, G] [E, F, G] [E, F, G]
[%, A, B] [%, A, B] [%, A, B]
[C, D, %] [C, %, D] [%, C, D]
[E, F, G] [E, F, G] [E, F, G]
我尝试了一种查看每一行并左右移动空间的方法,然后从中生成新的网格并递归。我将所有网格保存在一个集合中,并确保我只生成尚未检查的位置以防止无限递归。
但是,我的算法似乎效率极低(每个排列约 1 秒!!)而且看起来也不是很好。我想知道是否有一种雄辩的方式来做到这一点?特别是在python中。
我有一些模糊的想法,但我确信有一种方法可以做到这一点,我忽略了它的简短而简单。
编辑: 3x3 只是一个例子。网格可以是任何大小,真正重要的是行组合。例如:
[A, %, C]
[D, E, %, G]
[H, I]
也是一个有效的网格。
编辑2:字母必须保持顺序。例如[A, %, B] != [B, %, A]
并且[B, A, %]
无效