c# - 翻转瓷砖游戏

标签 c#

我需要帮助构建一个算法来解决翻转游戏:给定一个整数“n”,形成一个由 1 和 0 组成的 n x n 正方形。我必须将所有 1 翻转为 0。虽然,您只能以矩形的形式翻转图 block (矩形中的所有内容都会被切换),其中矩形的左上角顶点是正方形的左上角。我必须计算可以使全零切换的最小数量。

最佳答案

  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
    

如果我们按照这个顺序处理单元格,后面的单元格永远不会影响任何前面的单元格。因此,我们要么翻转当前单元格,要么不翻转。

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

关于c# - 翻转瓷砖游戏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41651679/

相关文章:

c# - 从标准格式获取自定义日期时间格式

c# - 如何在 C# 控制台中更改字符串中每个字母的前景色?

c# - SQLite-Net Extensions如何正确地递归更新对象

c# - 在一段代码中暂停 GC

c# - 断言(契约)和单元测试

c# - 应用程序崩溃

c# - 商店运算符(operator)直接使用?

c# - VSTO:不包含列标题

c# - 隐藏 ListViewItem 而不是删除它?

c# - 使用 is 运算符比较两个字符串