【发布时间】:2012-04-21 06:22:45
【问题描述】:
想象一个 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]
我尝试了一种查看每一行并左右移动空间的方法,然后从中生成新的网格并递归。我将所有网格保存在一个集合中,并确保只生成尚未检查的位置以防止无限递归。
但是,我的算法似乎效率极低(~1s 排列!!)而且看起来也不是很好。我想知道是否有一种雄辩的方式来做到这一点?特别是在python中。
我有一些模糊的想法,但我确信有一种方法可以做到这一点,但我忽略了这一点。
编辑: 3x3 只是一个例子。网格可以是任何大小,真正重要的是行组合。例如:
[A, %, C]
[D, E, %, G]
[H, I]
也是一个有效的网格。
编辑 2: 字母必须保持顺序。例如 [A, %, B] != [B, %, A] 和 [B, A, %] 无效
【问题讨论】:
-
这需要适用于任意大小的网格吗?
-
是 ["A","B","%] 被认为是 != ["B","A","%"]?
-
网格可以是任意大小,每行也可能有不同的长度。 3x3 只是一个例子。
-
确实,["A","B","%] 被认为是 != ["B","A","%"]
标签: python algorithm permutation array-algorithms