计算矩阵的排列数,其中元素仅与整数相邻

时间:2016-01-13 17:55:18

标签: python algorithm matrix integer

我试图编写一个Python代码,以确定矩阵的可能排列数,其中相邻元素只能是相邻的整数。我还想知道每组数字出现多少次(我的意思是,n个矩阵中每个整数的数字相同,但不是在相同的矩阵排列中)

如果我不清楚,或者我的术语不理想,请原谅我!考虑一个5 x 5零矩阵。这是一个可接受的permutaton,因为所有元素都与相同的数字相邻。

0  0  0  0  0
0  0  0  0  0
0  0  0  0  0
0  0  0  0  0
0  0  0  0  0

25 x 0, 0 x 1, 0 x 2

矩阵中的元素可以更改为1或2.将任何元素更改为1也是可接受的排列,因为1将被相邻的整数0包围。例如,更改中心[ 2,2]矩阵元素:

0  0  0  0  0
0  0  0  0  0
0  0  1  0  0
0  0  0  0  0
0  0  0  0  0


24 x 0, 1 x 1, 0 x 2

但是,将中心的[2,2]元素更改为2意味着它周围的所有元素都必须切换为1,因为2不与0相邻。

0  0  0  0  0
0  1  1  1  0
0  1  2  1  0
0  1  1  1  0
0  0  0  0  0

16 x 0, 8 x 1, 1 x 2

我想知道通过将元素更改为1和2,同时将相邻元素保持为相邻整数,可以从该归零的5x5矩阵中进行多少排列。换句话说,不允许0和2相邻的任何排列。

我也想知道有多少矩阵包含一定数量的每个整数。例如,下面的两个矩阵都是24 x 0,1 x 1,0 x 2.在每个排列中,我想知道有多少对应于这个整数频率。

0  0  0  0  0        0  0  0  0  0
0  0  0  0  0        0  0  0  0  0
0  0  1  0  0        1  0  0  0  0
0  0  0  0  0        0  0  0  0  0
0  0  0  0  0        0  0  0  0  0

再次,抱歉,如果我不清楚或我的命名很差!感谢您的时间 - 我非常感谢您提供一些帮助,并且会收到任何文字或指导。

谢谢, 萨姆

2 个答案:

答案 0 :(得分:0)

首先,你所谓的排列是不是。

其次你的问题是,一个天真的蛮力解决方案会看3^25 = 847,288,609,443种可能的组合。 (稍微少一些,但可能还有数千亿。)

解决此问题的正确方法称为动态编程。对于基本问题,您需要做的是针对i04计算,对于您可能拥有的每个不同行,您可以拥有多少个可能的矩阵在那一行结束。

在最后一行中添加所有可能的答案,然后您就可以得到答案。

对于更详细的计数,您需要按行划分,每个值的累计计数。但除此之外它是一样的。

直截了当的版本应该需要成千上万的操作。详细版本可能需要数百万。但这将比天真的递归版本所带来的数千亿更好。

答案 1 :(得分:0)

只需搜索一些更简单的规则:
1s可以在阵列中任意分布,因为到目前为止矩阵仅由0组成。 2s也可以任意分配,因为只有相邻的元素必须是1或2。

因此,在矩阵上分配1和2有f(x) = n! / x!种可能性。

因此,可能的排列总数为2 * sum(x = 1 , n * n){f(x)}

通过简单计算f(x),可以轻松计算固定数为1的可能排列数。

具有固定数量2和1的矩阵的数量有点棘手。在这里,您只能依赖于矩阵的所有镜像版本产生相同数量的1和2且有效的事实。除了使用这个事实,你只能强行搜索正确的解决方案。