证明算法对于解决游戏是正确的

时间:2012-03-14 13:02:44

标签: algorithm math proof induction

给出一排最多30块石头,可以是黑色或白色。游戏开始时不允许有任何差距,但可以少于30个宝石。 目标是去除所有的石头。只有黑石头可以被移除,如果石头被移除,其邻居会改变颜色。如果去除的石头位于中间,则会产生无法再填充的间隙;石头被移除后,那块石头的邻居不被认为是邻居。

现在,我已经创建了一个使用暴力解决这个游戏的程序。我得出的结论是,如果有任何黑色宝石(显然)并且黑色宝石的数量是奇数,那么游戏只能解决。此外,如果黑石的数量是奇数,游戏可以通过递归删除该行的第一块黑色石头来解决。

我的问题是我无法证明这种情况,黑石头的数量必须是奇数,并且移除第一块石头将解决游戏。我怎样才能正确证明这个算法?

我已经尝试使用感应,但我被卡住了:

  

行(a,b)= a *黑色+ b *白色

     

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?

提前感谢任何指针!

2 个答案:

答案 0 :(得分:3)

我建议你尝试将两个动作视为一个。 (即,在15次移动中移除了30颗宝石。)

这将允许您显示在整个游戏中具有奇数或偶数黑石的属性是不变的。证明草图如下:

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

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)是不可能解决的,因为每次双重移动都会删除偶数个黑色宝石,如果你以偶数开头,那你就不走运了:-)

答案 1 :(得分:2)

假设我们有一个可以解决的石头组而不拆分组(如果你必须拆分组,那么你实际上有两个不需要拆分的组)。从组中移除的最后一块石头必须是单一的黑色[B]。到[B]的唯一方法是通过[WB],没有别的办法。要进入[WB],您需要[BBB]或[WWB]。从这里出现了这种模式。到[xxW]的唯一方法是通过[xxBB],到[xxB]到[xxWB]。在所有这些转换中,奇偶校验不变,并且最终的黑色宝石数是奇数(一),因此单个不可拆分组的奇偶校验必须是奇数

假设该解决方案需要将一个组拆分为两个不可拆分的子组。我们已经得出结论,这两个子组必须具有奇数奇偶校验。如果我们排除将转变为新状态的黑色石头,那么这两个群体实际上拥有甚至数量的黑人。如果我们添加它们,并添加将进行转换的黑色石头,我们可以得出结论,通过将其拆分为两个不可拆分组而解决的组也必须具有奇数个黑色石头。 / p>

在单分组上使用归纳可以得出结论,任何组都必须有奇数个黑色。

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