我试图编写一个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
再次,抱歉,如果我不清楚或我的命名很差!感谢您的时间 - 我非常感谢您提供一些帮助,并且会收到任何文字或指导。
谢谢, 萨姆
答案 0 :(得分:0)
首先,你所谓的排列是不是。
其次你的问题是,一个天真的蛮力解决方案会看3^25 = 847,288,609,443
种可能的组合。 (稍微少一些,但可能还有数千亿。)
解决此问题的正确方法称为动态编程。对于基本问题,您需要做的是针对i
从0
到4
计算,对于您可能拥有的每个不同行,您可以拥有多少个可能的矩阵在那一行结束。
在最后一行中添加所有可能的答案,然后您就可以得到答案。
对于更详细的计数,您需要按行划分,每个值的累计计数。但除此之外它是一样的。
直截了当的版本应该需要成千上万的操作。详细版本可能需要数百万。但这将比天真的递归版本所带来的数千亿更好。
答案 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且有效的事实。除了使用这个事实,你只能强行搜索正确的解决方案。