如何删除重复的矩阵(以数组表示)?

时间:2011-03-08 21:21:41

标签: algorithm matrix

这个标题并没有完全描述我的意思,但我无法想出一个更好的标题。我来描述一下我的问题。

我有一个数组,其中包含许多数组。它看起来像

[
[a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p],
[i, j, k, l, m, n, o, p, a, b, c, d, e, f, g, h],
[m, i, e, a, n, j, f, b, o, k, g, c, p, l, h, d],

...

]

实际上,每个元素都代表一个矩阵,因此您可以将上层数组理解为

[
 +-            -+
 |  a, b, c, d  |
 |  e, f, g, h  |
 |  i, j, k, l  |     // matrix1
 |  m, n, o, p  |
 +-            -+ ,

 +-            -+
 |  i, j, k, l  |
 |  m, n, o, p  |
 |  a, b, c, d  |
 |  e, f, g, h  |
 +-            -+ ,

 +-            -+
 |  m, i, e, a  |
 |  n, j, f, b  |    // matrix2
 |  o, k, g, c  |
 |  p, l, h, d  |
 +-            -+ ,

 ...

]

我的数组是由a到p组成的字母组成的所有矩阵的超集。阵列中的某些矩阵被认为是重复的。如果您通过两个对角线水平,垂直地翻转矩阵,或者将其旋转90度,180度,270度并且结果矩阵包含在我的数组中,则这两个矩阵被视为“重复”。例如,如果顺时针旋转matrix1 90度,您将获得matrix2。因此,matrix2和matrix1被认为是重复的。我们只需要其中一个。我的问题是,删除原始数组中的重复项的最佳(最简单)方法是什么(哪一个被删除,哪一个被保留不是问题,你只保留其中一个)?

感谢。

1 个答案:

答案 0 :(得分:1)

我建议你定义一些代表你的矩阵的“标准”方式。该表示应该具有这样的属性:彼此的旋转和镜像的矩阵具有相同的表示,并且所有不是旋转的矩阵和彼此的镜像具有不同的表示。由于矩阵中的所有字母在您的情况下都是唯一的,您可以按如下方式定义“标准”表示:给定矩阵,旋转并翻转它,使所有角字母中的最低字母最终位于左上角,并且第二个最低的字母(在与最小字母相邻的两个角中)最后出现在右上角。然后,将矩阵“压缩”成一个字符串。例如,两者

h b d j
l n f i
o g a k
n c p e

e k i j
p a f d
c g n b
n o l h

(这是第一个顺时针旋转90度,然后颠倒翻转的矩阵)将具有标准表示ekijpafdcgnbnolh。您现在可以遍历所有矩阵,为每个矩阵生成标准表示,并将其放入HashSet(如果它已经存在)。丢弃标准表示已存在于集合中的所有矩阵。