在大网格上熄灯拼图

时间:2017-11-27 09:01:12

标签: algorithm multidimensional-array discrete-mathematics

我正在尝试解决this算法问题。为方便起见,我在下面复制了它:

  

给出大小为N×M(1 <= N,M <= 1000)的网格G,其仅包含1和0。如果我们选择其中一个单元格,这将切换相邻单元格(以及该单元格本身)中的值。恰好相差1行或1列的两个单元被认为是相邻的(即,对角单元不相邻)。我们的目标是在单元格位置找到一个包含1的网格G',以便将G中的所有单元格转换为0(我们不必选择的单元格标记为0)。鉴于任何G(在这个问题中),G'保证存在。

     

注意:网格中没有回绕。

例如,如果给出G如下:

000
100
000

如果我们选择中心单元格,G将变为:

010
011
010

对于这个例子,G'是:

001
011
001

它看起来与lights-out puzzle非常相似。我只能使用强力来解决小实例(N,M <= 20)的问题。在谷歌上搜索也会产生一个使用高斯消除的解决方案(用于熄灯拼图)。但这仅适用于小网格(N,M <= 100),因为该方法具有立方时间复杂度。

有人可以告诉我如何解决这个问题吗?

1 个答案:

答案 0 :(得分:0)

高斯消元不具有三次时间复杂度。 NxN矩阵需要O(N ^ 3)时间,但就输入大小而言,这只是O(N ^ 1.5)

要解决NxM网格上的熄灯问题,高斯消元需要O(N ^ 2 * M)时间和O(N * M)空间,其中N可以是哪个尺寸更小。

在平均PC或MAC上,如果你确保内部循环很快,你应该可以在C ++或Java中用很短的秒数做1000x1000。