在二维阵列中发现相同的图案

Spot the same patterns in 2D arrays

在一次采访中,我得到了一些二维数组,并被要求识别和计算每个数组中出现的相同模式的值。

模式可以是任何形式。它们可能是正方形、十字,可能有任何重复的形式。

数据看起来像这样:

ArrayOne
[0][1][1][0]
[0][1][1][0]

ArrayTwo
[1][1][0][0]
[0][1][0][0]
[0][1][0][0]

ArrayThree
[0][1]1][0]
[0][1][1][0]
[0][0][0][0]
[0][0][0][0]

人们希望看到的输出是:

ArrayOne ArrayThree - "Two occurrencies"
ArrayTwo ArrayTwo - "One occurency"

就目前而言,我看不出我们如何迭代此类数组以检索它们的模式。当然,我们可以统计每个数组中'1'的个数,但实际上,它没有用,不能回答问题。

非常感谢关于如何在 Java 或任何其他广泛使用的面向对象语言中实现这一目标的建设性建议。

编辑:数组内容已更新以消除原始 post

中存在的混淆

这是任何开始编程课程的典型问题。

方形图案和十字图案可以通过嵌套循环识别。

从索引 0,0 开始扫描矩阵。 首先 [1] 发生将索引保存为起始索引并按所需方向移动矩阵的其余部分(注意不要超过矩阵的最大大小)。

典型square/rectangle识别模​​式

x---->|
^     |
|     v
|<-----

您也可以查看是否已填满。 类似地,对于交叉模式,直线增加行和列索引。

They may be squares, crosses

在我看来,"pattern" 的定义是一组相连的非零单元格。对角线是否被认为是相连的还有待商榷,但对于正方形和十字形则不需要。

现在将所有这些图案收集到一个 Set 二维数组中。例如。请参阅 Find the number of islands 了解如何查找模式。

示例:

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

包含 2 个模式:

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

为每个输入数组构建一个 Set 模式,然后查看这些集合是否具有共同模式。

或者如果你有很多输入数组,构建一个 Map<Pattern, List<String>>,其中 Pattern 是一个 class 包装二维数组并实现 equals()hashCode()String 是输入数组的名称。