我需要帮助构建算法来解决平铺翻转游戏:给定整数'n',形成n x n平方1和0。我必须把所有1都翻到0。虽然,您只能以矩形的形式翻转切片(切换矩形中的所有内容),其中矩形的左上角是方形的左上角。我必须计算可以使全部为零的最小切换次数。
答案 0 :(得分: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)
时间复杂度(如果它很小,那么你可以天真地翻转矩形。
答案 1 :(得分:0)
不确定是否有超过@ kraskevich的答案的实际好处,除了逐渐缩短的行要翻转。
我的建议是翻转尚未最终形式的最远行并将其丢弃。然后,与原点相同距离的列相同。此时,您有一个n-1 x n-1平方,我们可以应用相同的解决方案。
我仍然觉得内部均匀矩形的情况非常不幸(全部为0或全部为1。
例如,假设您输入一个nxn平方,使其内部n-1 x n-1平方是同质的,最远的行和/或列随机“加扰”为0和1。然后,为了翻转这些外部瓷砖,你没有选择,只能完全扰乱内部正方形。
我的问题是:
我们实际上别无选择吗?没有可能全局帮助的预处理吗?
内部矩形会不可逆转地加扰吗?没有财产,我没有看到哪些仍然可以让我们从该地区最初统一的事实中获利?翻转外排瓷砖时会出现类似的问题,但在“解开”内部矩形中最远的一行之后,它的全部内容也很简单地被解读了吗?
编辑:
我认为第二个问题有肯定的答案,因为条件位翻转是可逆的。
然而,我仍然觉得需要一些最优的证据,我仍然没有提出。