这是一段时间的高中学位编码竞赛问题。基本的想法是重新创建一个黑色和白色的绘画,只有矩形的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
关于作业的技术性:
(xStart, yStart) (xEnd, yEnd)
。我想出了几种方法来做到这一点。我会在这里按照最差的顺序列出它们。
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 ++标记了这一点,不是因为这个问题特别涉及那些语言,而是因为我可以很容易地理解用这些语言编写的任何代码,以及语法相似的语言。
答案 0 :(得分:0)
我认为,要完成此任务,我们需要找到仅包含零的最大尺寸子矩阵的坐标。
我可以解释一下该算法,但我认为以下链接有最好的解释:
Maximum size sum-matrix with all 1s in binary matrix
此解决方案适用于所有1,我们可以为所有0修改它。
然后我们需要做的就是从最大值中找到坐标,我们就可以进行操作了。
如果我能想到更好的方法,我会更新。