C# 翻转瓷砖游戏

C# 翻转瓷砖游戏,c#,C#,我需要帮助建立一个算法来解决瓷砖翻转游戏:给定一个整数'n',形成一个1s和0s的nxn平方。我必须将所有的1翻转到0。尽管如此,您只能以矩形的形式翻转瓷砖(矩形中的所有内容都被切换),其中矩形的左上角垂直于正方形的左上角。我必须计算可以使所有零的最小切换次数 如果解决方案是最优的,则没有一个矩形会翻转一次以上(事实上,我们永远无法翻转它而不是翻转两次) 翻转的顺序无关紧要 因此,我们可以使用以下算法: for i = n - 1 downto 0 for j = n - 1 down

我需要帮助建立一个算法来解决瓷砖翻转游戏:给定一个整数'n',形成一个1s和0s的nxn平方。我必须将所有的1翻转到0。尽管如此,您只能以矩形的形式翻转瓷砖(矩形中的所有内容都被切换),其中矩形的左上角垂直于正方形的左上角。我必须计算可以使所有零的最小切换次数

  • 如果解决方案是最优的,则没有一个矩形会翻转一次以上(事实上,我们永远无法翻转它而不是翻转两次)

  • 翻转的顺序无关紧要

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

    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
    
  • 如果我们按照这个顺序处理单元格,后面的单元格永远不会影响前面的单元格。因此,我们要么翻转当前单元格,要么不翻转


    如果
    N
    很大,您可以使用矩形上的前缀和来确定我们是否需要进行翻转以获得
    O(N^2)
    时间复杂度(如果它很小,您可以天真地翻转矩形)。

    不确定@kraskevich的答案是否有实际好处,除了要翻转的行越来越短之外

    我的建议是翻转最远的一行,它还没有最后的形式,并丢弃它。然后,在距原点相同距离的柱上执行相同的操作。在这一点上,你有一个n-1 x n-1的平方,我们可以应用相同的解决方案

    我仍然发现内部同质矩形(所有0或所有1)的情况非常不幸

    例如,假设您有一个nxn正方形作为输入,这样它的内部n-1 x n-1正方形是均匀的,并且最远的行和/或列随机地用0和1“置乱”。然后,要翻转这些外部瓷砖,您别无选择,只能完全置乱内部正方形

    我的问题是:

    • 我们真的没有选择吗?没有可能的全局帮助的预处理

    • 内部矩形会被不可逆转地搅乱吗?没有我看不到的属性,它仍然可以让我们从区域原来是均匀的这一事实中获益吗?就像它在翻转外部行瓷砖时被搅乱,但在“解读”之后内部长方形中最远的一行,整个长方形也会被轻松解读

    编辑:

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


    然而,我仍然觉得需要一些我还没有想到的最优性证明。

    提示:一个矩形永远不应该被切换两次。想想如果我们从下到上遍历所有行,从右到左遍历每行中的所有单元格会发生什么。@Haystack52
    flip(I,j)
    意味着翻转矩形
    (0,0,I,j)
    @Haystack52:您的代码有一个很小的(打字风格)错误。请至少花几分钟调试它。