瓷砖的成对匹配

时间:2016-09-17 09:24:42

标签: algorithm hash language-agnostic matching

最近在编码比赛中,我遇到了这个问题。

  

我们有1000个瓷砖,每个瓷砖是3x3矩阵。每个细胞都在   matrix具有0到9之间的整数值,表示高程   细胞问题是找到最大的瓷砖对   它们非常适合。可以旋转瓷砖以适应。适合   在它中意味着对于图块A和图块B

     对于i = 0到8

A [i] + B [i] = const

我认为这个问题的方法是我可以保持与每个图块对应的哈希值。然后我会找到可能的瓷砖组合 可能适合并在哈希表中查找。

实施例。对于下面的图块

5 3 2                   4 6 7                           5 7 8
4 8 9  matches with     5 1 0   for const = 9  & with   6 2 1  for const=10
1 4 5                   8 5 4                           9 6 5

对于这个图块,'const'的范围从9(将0添加到最大元素)到10(将9添加到最小元素)。 所以我会得到两种可能的瓦片组合,我会在表格中查找。

但是这种方法很贪婪,并没有给出理想的答案,而且我也无法想到一个适当的哈希函数,它会考虑所有可能的旋转。

那么解决这个问题的好方法是什么?

我确信有一种蛮力的方法可以解决这个问题,但实际上我想知道问题的解决方案是否存在“成对等于k ”的问题。

2 个答案:

答案 0 :(得分:1)

对于n = 1000,我会坚持使用O(n ^ 2)强力解决方案。然而,下面描述了O(n log n)算法。

词典编排顺序由以下小于运算符定义:

给定两个矩阵M1, M2,如果M1'为正数,则将M1定义为M1[1];如果-M1为负数,则定义为M1[1],同样或M2' 。如果M1<M2M1'[1]<M2'[1],M1'[1] == M2'[1]M1'[2] < M2'[2],以及M1'[1] == M2'[1]M1'[2] == M2'[2]等,我们会说M1'[3] < M2'[3]

  1. 从矩阵的其余元素中减去每个矩阵的中间元素,即A'[5] = A[5]A'[i] = A[i] - A[5].如果A'[i] +B'[i] = 0 i!=5,则A'适合B' 1}},标高为A'[5] + B'[5].

  2. 创建矩阵数组和字典。在将每个矩阵添加到数组之前,旋转每个矩阵,使左上角的绝对值最小。如果有多个角具有相同的绝对值,则复制矩阵并将两个旋转存储在数组中。

    如果矩阵的某些旋转与自身匹配且i,j是此矩阵的旋转索引,请将键值对(i,j)(j, i)添加到字典中。

  3. 创建索引1,2的数组S ...并使用词典编排排序S.

  4. 不需要O(n ^ 2)次操作来检查所有可能的矩阵对,只需要检查索引为S_iS_(i+1).的所有矩阵对。在计算对的高程之前,使用字典来检查两个矩阵是否不是相同原始矩阵的旋转。

答案 1 :(得分:0)

不确定这是否是最有效的方法,但确实有效。

我要做的是:

  1. 浏览所有图块并检查每个图块的最大值和最小值,并将其保存在不同的数组中。
  2. 检查所有可能的对。
    1. 如果B,请检查A的某些轮播是否完全适合1。如果是,请将O(1)添加到您的计数中。
    2. 否则,它不合适,所以你可以跳过检查这对。
  3. 注意:为每个磁贴保存最大值和最小值的原因是,它可以为我们节省不必要的计算和检查轮换,如{{1}}中我们可以检查它是否不合适