重新创建最少" XOR"的二进制矩阵。操作

时间:2014-12-02 08:19:25

标签: java c++ algorithm binary xor

这是一段时间的高中学位编码竞赛问题。基本的想法是重新创建一个黑色和白色的绘画,只有矩形的XOR操作,或者他们称之为。

问题

让我们假设我们正在尝试重新创建这幅画(表示为二进制矩阵,0表示黑色,1表示白色):

1 0 0
1 1 1
1 0 1

重建绘画的一种方法是进行以下操作:

(0, 0) (2, 2)
(1, 0) (2, 0)
(1, 2) (1, 2)

操作采用(xStart, yStart) (xEnd, yEnd)

的形式

因此,如果我们从全黑画布开始,上述操作将执行以下操作:

beginning:

    0 0 0
    0 0 0
    0 0 0

after (0, 0) (2, 2) :

    1 1 1
    1 1 1
    1 1 1

after (1, 0) (2, 0) :

    1 0 0
    1 1 1
    1 1 1

after (1, 2) (1, 2) :

    1 0 0
    1 1 1
    1 0 1

关于作业的技术性:

  • Winner拥有至少操作。
  • 一项操作应采用(xStart, yStart) (xEnd, yEnd)
  • 的形式
  • 没有时间或空间限制。
  • 在作业中,我们尝试重新创建的绘画尺寸为200x200,并使用2000次随机XOR操作生成。

我自己的想法

我想出了几种方法来做到这一点。我会在这里按照最差的顺序列出它们。

XOR所有像素

我们可以通过简单地将1写入空白画布来重新创建绘画,其中1位于我们尝试重新创建的绘画中。这个解决方案是最简单,最明显的。所需的操作数基本上是绘画中白色像素的数量。

XOR所有水平相邻的白色:

这是第一个解决方案的重大改进,但仍然非常简单明了。在这种方法中,我们只是对所有水平相邻的白色进行异或。这样,例如操作

(0, 0) (0, 0)
(1, 0) (1, 0)
(2, 0) (2, 0)

会减少到(0, 0) (2, 0)

XOR矩形:

我认为这是前一种方法的明确跟进,我们可以看到高度为1的XORing矩形 - 现在我们只是在矩形中添加第二个维度,进一步改善了我们的结果。我通过获得白色最多的矩形来确定XORable区域。改善仍然很好。

XOR最大的差异:

这与上述方法略有不同,而且有点蛮力。在这个方法中,我找到了与绘画最大区别的矩形,并对它进行异或。例如,如果我们有绘画

1 0 1
0 1 1
0 1 0

和一个全黑色的画布,最大的区别在于矩形(0, 0) (2, 1),它有两个相差2.我通过获得绘画的所有非相同颜色来计算差异,即4在上述情况下,然后从中减去相同颜色的数量,在上述情况下为2.所以different_colors - same_colors = difference

在上面的绘画和空白画布中,有许多矩形会产生相同的差异。另一个是(1, 0) (2, 2)

这种方法与前一种方法相比,在大型绘画方面取得了最小的改进,但仍然有所改进。在这个方法中,有时候会出现比前一个有小画的更糟糕的解决方案(不记得有多小)。


我所用的上述方法的代码已经很久没了。你能想出令人叹为观止的解决方案吗?外太空是否有神奇的方法?我发现这个问题(帖子)非常有趣,并希望看看是否有人能想出任何东西。


关于代码

我用Java和C ++标记了这一点,不是因为这个问题特别涉及那些语言,而是因为我可以很容易地理解用这些语言编写的任何代码,以及语法相似的语言。

1 个答案:

答案 0 :(得分:0)

我认为,要完成此任务,我们需要找到仅包含零的最大尺寸子矩阵的坐标。

我可以解释一下该算法,但我认为以下链接有最好的解释:

Maximum size sum-matrix with all 1s in binary matrix

此解决方案适用于所有1,我们可以为所有0修改它。

然后我们需要做的就是从最大值中找到坐标,我们就可以进行操作了。

如果我能想到更好的方法,我会更新。