有矩阵M * N.矩阵元素是黑色或白色。我们将相同颜色的相邻元素称为区域。您可以选择任何区域和翻转其颜色(即更改其所有元素的颜色)。鉴于这样的矩阵,找到使整个矩阵为黑色或白色所需的最小数量的翻转。
解决方案:它看起来像图形问题。矩阵元素是图顶点。如果对应的矩阵元素是“邻居”并且具有相同的颜色,则连接顶点。答案是图中连接组件的数量。
有意义吗?
修复解决方案:感谢@ypercube和@Billiska,解决方案应修复如下:
我们仍需要证明,翻转图表中心会使翻转次数变得最小。
答案 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-1
或2n
(2n
或2n+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级。 但最有效的算法只会选择翻转中间区域。