最近在编码比赛中,我遇到了这个问题。
我们有1000个瓷砖,每个瓷砖是3x3矩阵。每个细胞都在 matrix具有0到9之间的整数值,表示高程 细胞问题是找到最大的瓷砖对 它们非常适合。可以旋转瓷砖以适应。适合 在它中意味着对于图块A和图块B
对于i = 0到8A [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 ”的问题。
答案 0 :(得分:1)
对于n = 1000,我会坚持使用O(n ^ 2)强力解决方案。然而,下面描述了O(n log n)算法。
词典编排顺序由以下小于运算符定义:
给定两个矩阵M1, M2
,如果M1'
为正数,则将M1
定义为M1[1]
;如果-M1
为负数,则定义为M1[1]
,同样或M2' 。如果M1<M2
或M1'[1]<M2'[1],
和M1'[1] == M2'[1]
或M1'[2] < M2'[2],
以及M1'[1] == M2'[1]
和M1'[2] == M2'[2]
等,我们会说M1'[3] < M2'[3]
。
从矩阵的其余元素中减去每个矩阵的中间元素,即A'[5] = A[5]
和A'[i] = A[i] - A[5].
如果A'[i] +B'[i] = 0
i!=5
,则A'适合B' 1}},标高为A'[5] + B'[5].
创建矩阵数组和字典。在将每个矩阵添加到数组之前,旋转每个矩阵,使左上角的绝对值最小。如果有多个角具有相同的绝对值,则复制矩阵并将两个旋转存储在数组中。
如果矩阵的某些旋转与自身匹配且i,j
是此矩阵的旋转索引,请将键值对(i,j)
和(j, i)
添加到字典中。
创建索引1,2的数组S ...并使用词典编排排序S.
不需要O(n ^ 2)次操作来检查所有可能的矩阵对,只需要检查索引为S_i
和S_(i+1).
的所有矩阵对。在计算对的高程之前,使用字典来检查两个矩阵是否不是相同原始矩阵的旋转。
答案 1 :(得分:0)
不确定这是否是最有效的方法,但确实有效。
我要做的是:
B
,请检查A
的某些轮播是否完全适合1
。如果是,请将O(1)
添加到您的计数中。注意:为每个磁贴保存最大值和最小值的原因是,它可以为我们节省不必要的计算和检查轮换,如{{1}}中我们可以检查它是否不合适