【问题标题】:Proving an algorithm is correct for solving a game证明算法对于解决游戏是正确的
【发布时间】: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


【解决方案1】:

假设我们有一个无需拆分组即可解决的石头组(如果您必须拆分组,那么您实际上有两个不需要拆分的组)。从组中移除的最后一颗棋子必须是单黑 [B]。到达[B]的唯一途径是通过[WB],没有其他途径。要到达 [WB],您需要 [BBB] 或 [WWB]。模式从这里出现。到达 [xxW] 的唯一方法是通过 [xxBB],而到达 [xxB] 的唯一方法是通过 [xxWB]。在所有这些转换中,奇偶性不变,最终黑子的数量是奇数(一个),因此单个不可拆分组的奇偶性必须是奇数

假设解决方案需要将一个组拆分为两个不可拆分的子组。我们已经得出结论,这两个子组必须具有奇等价。如果我们排除将过渡到新状态的黑色石头,那么这两组实际上有偶数个黑色。如果我们添加它们,并添加将进行转换的黑子,我们可以得出结论,通过将其拆分为两个不可拆分组来解决的组也必须具有奇数个黑子

对单分裂组使用归纳法,我们可以得出结论,任何组都必须有奇数个黑人。

原始问题的解决方案不需要蛮力。只需选择你出现的第一块黑色石头。

【讨论】:

  • 您能否评论一下移除一组可能会影响相邻组石头颜色的事实?
  • 我不太明白。当最后一块石头(黑色)被移除时,组被移除。该移除不会影响任何其他组或棋子,因为没有相邻的棋子。
  • 感谢您的回答!我想我知道你在说什么。我们从一个可能的解决方案开始,然后倒推逻辑。假设我们有一小组 n=3 的石头,唯一可解决的情况是 [WWB] 和 [BBB](顺序可以颠倒)。如果这些小子组仍然必须是可解的,则只能通过在它们之间添加 [B] 来将它们拼凑在一起。但我们如何证明这一点?如果这被证明了,我们确实可以通过归纳来证明它。是的,我知道这不需要蛮力,但这是我的第一道攻击线。我很快发现了另一种方法;)
  • 我明白了!非常感谢您的明确回答,对我帮助很大!
  • 顺便说一句,如果间隙不能阻止石头彼此相邻,这个问题会更有趣也更难。
【解决方案2】:

我建议您尝试将两个动作视为一个动作。 (即 30 块石头在 15 步中被移除。)

这将让您证明拥有奇数或偶数黑子的属性在整个游戏中是不变的。证明草图如下:

基本情况: 剩下两块石头。奇数个黑人。两块石头都可以在一个双重移动中移除:

b w       -> _ b        ->  _ _
w b       -> b _        ->  _ _

对于四颗或更多的石头,列出各种不同的可能前缀,其中OE 代表带有奇数偶数的石头的后缀序列分别是黑人的数量。

这里有两个案例可以帮助您入门:

b b w b E  -> _ w b b E  ->  _ w _ w E
b b w w O  -> _ w b w O  ->  _ b _ b O
....

在每种情况下,您都注意到生成的序列(例如_ w _ w O)包含奇数个黑人。

由于如果一个序列由一颗石头组成,并且石头的数量是奇数,那么那颗石头必然是黑色的,这意味着最后一块石头也可以被移除。


注意到您还想表明,如果黑色石头的数量是偶数,那是不可能的。这同样容易。基本情况(b bw w)是不可能解决的,而且由于每次双移动会移除偶数个黑子,所以如果你从偶数开始,你就不走运了 :-)

【讨论】:

  • 谢谢aioobe,这很有帮助!我会尝试这种方式并回复我是否成功;)
  • 有一件事仍然困扰着我:假设我从 bbwwO 开始,这导致 _b_b O 如上所述。这是无法解决的,因为 _bO 已经变成了新的一排黑子是偶数的棋子,对吧?
  • 虽然基本思路不错,但这是不正确的。由于可以将行拆分为独立的子问题,因此黑子的数量为奇数并不是一个不变的问题。考虑wwbww。显然可以解决,但您必须通过黑色石头偶数的状态。
  • 嗯.. 我解释了 x_x_x 的中间石头有两个邻居。我猜是我的误解。
  • 对不起,如果不清楚,但如果我们有 x1_x2_x3,石头 x2 没有邻居,因为它周围只有间隙。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-10-25
  • 2017-10-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多