翻转平铺游戏

时间:2017-01-14 15:33:04

标签: c#

我需要帮助构建算法来解决平铺翻转游戏:给定整数'n',形成n x n平方1和0。我必须把所有1都翻到0。虽然,您只能以矩形的形式翻转切片(切换矩形中的所有内容),其中矩形的左上角是方形的左上角。我必须计算可以使全部为零的最小切换次数。

2 个答案:

答案 0 :(得分:3)

  1. 如果解决方案是最佳的,则不会翻转多个矩形(实际上,我们永远不能翻转它而不是翻转它两次)。

  2. 翻转的顺序并不重要。

  3. 因此,我们可以使用以下算法:

    for i = n - 1 downto 0
         for j = n - 1 downto 0
             if f[i][j] == 1
                 flip(i, j) // This function should flip the entire rectangle
                 res += 1
    
  4. 如果我们按此顺序处理单元格,以后的单元格永远不会影响任何前一个单元格。因此,我们要么翻转当前的单元格,要么我们不要。

    如果N很大,您可以在矩形上使用前缀和来查找我们是否需要翻转才能获得O(N^2)时间复杂度(如果它很小,那么你可以天真地翻转矩形。

答案 1 :(得分:0)

不确定是否有超过@ kraskevich的答案的实际好处,除了逐渐缩短的行要翻转。

我的建议是翻转尚未最终形式的最远行并将其丢弃。然后,与原点相同距离的列相同。此时,您有一个n-1 x n-1平方,我们可以应用相同的解决方案。

我仍然觉得内部均匀矩形的情况非常不幸(全部为0或全部为1。

例如,假设您输入一个nxn平方,使其内部n-1 x n-1平方是同质的,最远的行和/或列随机“加扰”为0和1。然后,为了翻转这些外部瓷砖,你没有选择,只能完全扰乱内部正方形。

我的问题是:

  • 我们实际上别无选择吗?没有可能全局帮助的预处理吗?

  • 内部矩形会不可逆转地加扰吗?没有财产,我没有看到哪些仍然可以让我们从该地区最初统一的事实中获利?翻转外排瓷砖时会出现类似的问题,但在“解开”内部矩形中最远的一行之后,它的全部内容也很简单地被解读了吗?

编辑:

我认为第二个问题有肯定的答案,因为条件位翻转是可逆的。

然而,我仍然觉得需要一些最优的证据,我仍然没有提出。