【发布时间】:2012-03-14 13:02:43
【问题描述】:
给定一排最多 30 颗可以是黑色或白色的石头。比赛开始时不允许有空隙,但可以少于 30 颗棋子。 目标是移除所有的石头。只有黑色的石头可以被移除,如果一颗石头被移除,它的邻居会改变颜色。如果移除的石头在中间,就会产生一个无法再填充的空隙;移除该石头后,该石头的邻居不被视为邻居。
现在,我创建了一个使用蛮力解决这个游戏的程序。我得出的结论是,只有在有任何黑子(显然)并且黑子的数量是奇数的情况下,该游戏才可以解决。另外,如果黑子的个数是奇数,则可以通过递归删除该行的第一个黑子来解决游戏。
我的问题是我无法证明黑子的数量一定是奇数并且移开第一块棋子就可以解决这个游戏的条件。如何正确证明这个算法?
我已经尝试过使用归纳法,但我卡住了:
行(a,b) = a*black + b*white
RemoveFirstBlack(Row(1, b)) = RemoveFirstBlack(black + b*white) = 0(如果 a=1 或 n = 0,其中 a=2n+1 且 n 为整数)
假设 RemoveFirstBlack(Row(k*a, b)) = RemoveFirstBlack(k*a*black + b*white) = 0 其中 k = 2p + 1 和 p 一个整数。
RemoveFirstBlack(Row((k+1)*a, b)) = RemoveFirstBlack((k+1)*a*black + b*white) = RemoveFirstBlack((2(p+1)(2n+1))*black + b*white) = RemoveFirstBlack(2(p+1)*a*black + b*white) = 0?
在此先感谢您的任何指点!
【问题讨论】:
-
使用数学和博弈论。通过越来越多的例子证明它是真实的,你无法找到任何东西的正面证据。你所希望的最好结果就是证明你错了。
-
@AlexanderCorwin,你是什么意思?在这种情况下,归纳证明将是完全有效的。
-
没有单独的“理论计算机科学”StackExchange 站点吗?
-
你提到了差距。如果我移开中间的一块石头,现在是否有间隙将两个不同的行分开?我移除的石头的邻居现在是否被视为邻居?
-
感谢您的见解。我在这里问我的问题是因为我相信算法与编程密切相关,算法的正确性与程序的正确性密切相关,但如果我错了,请纠正我;)@MichaelJ.Barber:如果中间有一块石头是删除,有一个无法再填补的空白。因此,在移除石头后,该石头的邻居不会被视为邻居。
标签: algorithm math proof induction