翻硬币问题
翻硬币问题有好几种。
其中的一种是这样的:
桌子上有q = m + n枚硬币,m正面朝上,n枚反面朝上,每一轮翻p枚,在每一轮翻币的时候,被翻的同一枚硬币只能翻一次。问最少多少次能把所有的硬币翻成全部正面或者反面朝上?根据问题的描述,问题实际上隐含:m 、n、 p > 0,m + n > p。
这个问题往往是计算机编程的问题。涉及广度优先还是深度优先搜索。
我对广度优先还是深度优先搜索了解的甚少。以下是用笨办法求解的。
1) 币面状态数:用 (正面朝上币数, 反面朝上币数 )表示,显然初始状态是( m, n )。
假设第一轮翻币翻反面(或者正面)的硬币数为:i1<=n,则第一轮翻币分别翻正面(或者反面)的硬币数为:p - i1 <m,此时币面状态数为:
( m – ( p - i1 ) + i1, n - i1 + ( p - i1 ) ) = ( m – p + 2 * i1 , n + p - 2 * i1)
第二轮翻币翻反面(或者正面)的硬币数为:i2< n + p - 2 * i1,则第二轮翻币分别翻正面(或者反面)的硬币数为:p – i2 < m – p + 2 * i1, 此时币面状态数为:
( m – p + 2 * i1 – ( p – i2 ) + i2, n + p - 2 * i1 + p - 2 * i2)
= ( m – 2 * p + 2 * ( i1 + i2 ) , n + 2 * p - 2 * ( i1 + i2 ) )
第三轮币面状态数: