首页 文章

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

提问于
浏览
1

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

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

[
[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 回答

  • 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 (如果尚未存在) . 丢弃标准表示已存在于集合中的所有矩阵 .

相关问题