请考虑以下2D矩阵:
0,0,0,0,0
0,0,1,0,0
0,0,0,1,0
0,0,0,0,0
我只能做从端到端边缘延伸的水平或垂直切割。
可以使用什么算法,这样我可以找出将矩阵分成2个部分多少次,从而使2个部分中的每一个都具有等于1的像元数目?
答案 0 :(得分:1)
我假设您只能进行一个水平切割或垂直切割。
“一个单一矩阵” 的一种方法是:(您需要将此方法重复应用于获得的每个分区)。
计算每行的个数和每列的个数,将它们存储在两个数组中,例如
$('#showChartModal').on('shown.bs.modal', function (e) {
Chart.defaults.global.tooltips.enabled = true;
});
还要计算矩阵中1的总数,它实际上是上述两个数组中所有元素的值之和。
tooltips
例如,您可以像OnesInRow[num_rows] , OnesInColumn[num_cols]
这样获得行号2中的个数(假设行索引从0开始)。同样,第3列中的数字为total = Sum( All elements in OnesInRow )
。
现在考虑这样的水平切割:
0,0,0,0,0
0,0,1,0,0
0,0,0,1,0
0,0,0,0,0
在每个分区中获得的数量为:OnesInRow[1]
为此:
0,0,0,0,0
0,0,1,0,0
0,0,0,1,0
0,0,0,0,0
它是:OnesInCol[2]
为此:
0,0,| 0,0,0
0,0,| 1,0,0
0,0,| 0,1,0
0,0,| 0,0,0
它是:OnesInRow[0], Total - OnesInRow[0]
因此,您只需要考虑所有行剪切和列剪切,并采用其中哪些剪切将导致两个相等的分区。
Total - ( OnesInRow[0] + OnesInRow[1] ) , OnesInRow[0] + OnesInRow[1]
然后对于从这样的分区获得的每个矩阵,您可以递归地重复该过程,直到无法剪切,即数组中只有一个元素。 在每次递归时,您都维护一个count变量并对其进行更新。