想象一个3x3的网格:
同样的,对于第二行也是如此。第三行没有空格,因此无法改变。
我试图生成所有可能的方格,给定每行的可能排列。
输出应该产生以下方格:
我尝试了一种方法,即查看每一行并将空格向左和向右移动,然后根据此生成新的网格并进行递归。我将所有网格保存在集合中,并确保我只产生尚未被检查过的位置,以防止无限递归。
然而,我的算法似乎非常低效(每个排列大约需要1秒!!),而且看起来也不太好。我想知道是否有一种优雅的方法来做到这一点?特别是在Python中。
我有一些模糊的想法,但我肯定会忽略一种简短而简单的方法来完成这个任务。
编辑: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,%]
无效