谜语:如何改变矩阵颜色?

时间:2012-11-26 17:40:41

标签: algorithm language-agnostic graph matrix

有矩阵M * N.矩阵元素是黑色或白色。我们将相同颜色的相邻元素称为区域。您可以选择任何区域翻转其颜色(即更改其所有元素的颜色)。鉴于这样的矩阵,找到使整个矩阵为黑色或白色所需的最小数量的翻转

解决方案:它看起来像图形问题。矩阵元素是图顶点。如果对应的矩阵元素是“邻居”并且具有相同的颜色,则连接顶点。答案是图中连接组件的数量。

有意义吗?

修复解决方案:感谢@ypercube和@Billiska,解决方案应修复如下:

  • 查找连接的组件(如上所述)并考虑这些组件的图表。
  • 找到图center,翻转图表,制作新图表,然后重复,直到图表只包含一个顶点。

我们仍需要证明,翻转图表中心会使翻转次数变得最小。

3 个答案:

答案 0 :(得分:5)

您提出了解决方案:

  

它看起来像一个图形问题。矩阵元素是图顶点。如果对应的矩阵元素是“邻居”并且具有相同的颜色,则连接顶点。答案是图中连接组件的数量。

改善:

  

然后必须找到“黑色”和“白色”连接组件的数量,并选择两者中最小的组件。

这似乎相当不错,但答案并不像最初看起来那么简单。考虑这个矩阵,其中有13个黑色连接组件和4个白色组件。 :

B w B w B w B w B
w w w w B w w w w
B w B B B B B w B
w w B B B B B w w
B B B B B B B B B  
w w B B B B B w w
B w B B B B B w B
w w w w B w w w w
B w B w B w B w B

最小的解决方案只有2个动作。首先翻转(到白色)中央大黑色组件。结果,翻转的一个和4个白色组件现在连接成一个组件。翻转为黑色,所有电路板都是黑色。

因此,在这种情况下,最小值只有2次,而不是4次。

因此,在建立连接(黑色和白色组件)之后,我们有一个这些组件之间的连接图(如@ Biliska的答案)。以下是上述矩阵的图表:

        B
        |
     B--w--B
        |
    B   |   B
    |   |   |
B---w---B---w---B
    |   |   |
    B   |   B
        |
     B--w--B
        |
        B

我们现在需要找到图表的 center ,或者只是其中一个中心点,例如:节点A,其中与其他节点B的最大距离d(A,B)最小(并且该最小最大距离有时称为“偏心率”)。从图中可以明显看出,对于上图,只有一个中心点,“偏心率”为2。

当偏心率为n时,至少有一条长度为2n-12n2n2n+1个节点的“最大”路径) 。在我们的案例中:

B-w-B-w-B

由于这些图中的节点在任何路径中都是连续的黑白,因此不难证明所需的最小变化是n(在这种情况下为2),并且可以通过始终更改中心来实现区域。

答案 1 :(得分:3)

此问题可以shortest path problem解决。

将问题建模为状态图G=(V,E),其中V = possible states (matrix states)E = { (u,v) | can move from state u to state v with single "flip" }

现在,一旦你有了图表 - 你所要做的就是使用一些最短路径算法。

由于图表未加权 - 您可以使用BFS作为最短路径算法。如果您可以找到一些admissible heuristic function - 您也可以使用A* algorithm - 使用下降启发式预计会更快。

答案 2 :(得分:3)

首先,你试图将问题建模为单元格的连接图,而事实上你应该将问题建模为区域的连接图

为了exapmle

b w b w b
w b b w b
w w b b w

转换为区域符号:

1 2 3 4 5
6 3 3 4 5
6 6 3 3 7

更好地表示为:

1 - 2   4 - 5
|   | /     |
6 - 3 - - - 7

现在接下来要做的就是 重复执行flip操作以合并区域。 我不确定是否贪婪地翻转大多数连接的区域是否正确。

例如,我首先翻转区域3,因为它有4个连接。然后我得到:

1       5
  \   /
   (3)

然后再次翻转区域3,因为它有2个连接:

   (3)

完成

因此,您可以看到flip操作具有将所有相邻节点合并到正在翻转的节点的效果。

编辑:事实上,大多数连接的贪婪翻转区域并不是最佳的。 以我之前评论的一维示例为例。

输入:

             middle
                v
b w b w b w b w b w b w b w b w b
<---4 times--->   <---4 times--->

您可以看到任何区域的连接数最多为2级。 但最有效的算法只会选择翻转中间区域。

相关问题