Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/140.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 重新创建一个二元矩阵,最小为“;“异或”;操作_Java_C++_Algorithm_Binary_Xor - Fatal编程技术网

Java 重新创建一个二元矩阵,最小为“;“异或”;操作

Java 重新创建一个二元矩阵,最小为“;“异或”;操作,java,c++,algorithm,binary,xor,Java,C++,Algorithm,Binary,Xor,这是一个高中学位编码竞赛的问题。基本的想法是用矩形的异或运算,或者他们所说的那样,重新绘制一幅黑白画 问题 让我们假设我们有这幅画,我们正试图重建(表示为一个二进制矩阵,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为黑色,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)
  • 没有时间或空间限制
  • 在作业中,我们试图重建的绘画大小为200x200,并通过2000次随机异或操作生成

我自己的想法 我想出了两种方法来做到这一点。我会把它们按从坏到好的顺序列在这里

异或所有像素:

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

异或所有水平相邻的白色:

与第一个解决方案相比,这是一个实质性的改进,但仍然非常简单和明显。在这种方法中,我们只需对所有水平相邻的白色进行异或运算。以这种方式,例如操作

(0, 0) (0, 0)
(1, 0) (1, 0)
(2, 0) (2, 0)
将减少到
(0,0)(2,0)

异或矩形:

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

最大的区别是:

这是对上述方法的一个小小的改变,并且更加暴力。在这种方法中,我找到了与绘画差异最大的矩形,并对其进行异或运算。例如,如果我们有这幅画

1 0 1
0 1 1
0 1 0
对于全黑画布,最大的区别是矩形
(0,0)(2,1)
,它的区别是2。我通过得到画上所有不相同的颜色来计算差异,在上述情况下为4,然后从中减去相同颜色的数量,在上述情况下为2。所以
不同的颜色-相同的颜色=不同

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

这种方法与前一种大型绘画相比,改进最小,但仍然有所改进。有趣的是,这种方法有时会提出一个比前一种小画更糟糕的解决方案(尽管不记得有多小)


我为上述方法编写的任何代码早就丢失了。你能想出惊人的解决办法吗?是否有一种来自外层空间的神奇方法?我觉得这个问题(帖子)很有趣,我想看看是否有人能想出什么办法


关于标签


我用java和C++标记这个词,不是因为这个问题特别是那些语言,而是因为我能很容易地理解用这些语言编写的任何代码,以及类似语法的语言。我们需要找到只包含零的最大尺寸子矩阵的坐标

我可以解释这个算法,但我认为下面的链接有最好的解释:

这里的解决方案适用于所有1,我们可以对所有0进行修改

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


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

也许@weston更好这个问题对stackexchange的用户来说并不是一个难题。我个人希望在这些用户的帮助下找到一个解决这个问题的好办法。通过“XORing”,我想你的意思是“用1进行XORing”,即翻转位。@user1990169它只是翻转位,是的。1变为0,0变为1。请参见。
1 0 1
0 1 1
0 1 0