ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

python-网格置换算法-固定行顺序

2019-12-01 14:59:29  阅读:258  来源: 互联网

标签:array-algorithms permutation python algorithm


想象一个3×3的网格:

[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中.

我有一些模糊的想法,但是我敢肯定有一种方法可以做到这一点,而这是我所忽略的简短的过程.

编辑:3×3只是一个例子.网格可以是任意大小,实际上行组合很重要.例如:

[A, %, C]
[D, E, %, G]
[H, I]

也是有效的网格.

编辑2:字母必须保持其顺序.例如[A,%,B]!= [B,%,A]和[B,A,%]无效

解决方法:

首先,您必须获得每一行的所有所需排列.然后,您可以计算所有线的叉积.

通过使用字母[A,B,%]并更改起始索引,可以简单地计算一行的排列:

import itertools
# Example: line = ['A','B','%']
def line_permutations(line):
   if '%' not in line:
       return [line]
   line.remove('%') # use copy.copy if you don't want to modify your matrix here
   return (line[:i] + ['%'] + line[i:] for i in range(len(line) + 1))

使用itertools.cross产品最容易实现

matrix = [['A','B','%'], ['C', '%', 'D'], ['E', 'F', 'G']]
permutations = itertools.product(*[line_permutations(line) for line in matrix])
for p in permutations:
    print(p)

该解决方案在内存和CPU需求方面是最佳的,因为永远不会重新计算排列.

输出示例:

(['%', 'A', 'B'], ['%', 'C', 'D'], ['E', 'F', 'G'])
(['%', 'A', 'B'], ['C', '%', 'D'], ['E', 'F', 'G'])
(['%', 'A', 'B'], ['C', 'D', '%'], ['E', 'F', 'G'])
(['A', '%', 'B'], ['%', 'C', 'D'], ['E', 'F', 'G'])
(['A', '%', 'B'], ['C', '%', 'D'], ['E', 'F', 'G'])
(['A', '%', 'B'], ['C', 'D', '%'], ['E', 'F', 'G'])
(['A', 'B', '%'], ['%', 'C', 'D'], ['E', 'F', 'G'])
(['A', 'B', '%'], ['C', '%', 'D'], ['E', 'F', 'G'])
(['A', 'B', '%'], ['C', 'D', '%'], ['E', 'F', 'G'])

标签:array-algorithms,permutation,python,algorithm
来源: https://codeday.me/bug/20191201/2081295.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有