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