将2D数组细分为最大的连续正方形

时间:2019-06-25 14:40:33

标签: multidimensional-array kotlin graph-traversal

给出任意的二维整数数组(例如):

0, 1, 1, 0, 0
1, 1, 1, 0, 0
1, 1, 1, 1, 1
1, 1, 1, 1, 1
0, 0, 1, 0, 0

我需要一种将该数组划分为每个值的最大连续“正方形”的方法:

// Should return a map of 2D array chunks keyed to the "start" indices of the chunk.
fun Array<Array<Int>>.chunkBy(): Map<Pair<Int, Int>, Array<Array<Int>>> {
    TODO("Not Implemented")
}

val array: Array<Array<Int>> = ...

val oneBlocks:  = array.chunkBy(1)

// The chunk starting @ 0,1 should be a 3x3 array of ints
assertEquals(oneBlocks[0 to 1], arrayOf(
    intArrayOf(1, 1, 1,), 
    intArrayOf(1, 1, 1,), 
    intArrayOf(1, 1, 1,)
)

// No chunks start @ 1,1 so should be null
assertNull(oneBlocks[1, 1])

// 1x1 chunks are acceptable
val zeroBlocks = array.chunkBy(0)
assertEquals(zeroBlocks[0 to 4], arrayOf(intArrayOf(0)))

这种感觉对我来说knapsack problem,但是由于我可以将数组细分为最小的项值,所以我也觉得它应该更容易实现。

我考虑了几种不同的实现;我正在考虑的问题涉及找到网格中最大的块并将这些单元标记为已访问,然后以越来越小的大小重复直到只有1x1的块被标记为止,但是我对这个问题是否有更通用的解决方案感兴趣

0 个答案:

没有答案