拿硬币的必胜方 轮流拿硬币 最后拿的输

硬币游戏

一堆硬币,共n枚,两个人轮流从其中拿出若干枚,每次只能拿1个,2个或者4个。

规定最后一个拿硬币的人为输。问:在先手和后手中,谁有必胜策略?

比如,最简单的情况,总共就1枚硬币,则后手有必胜策略(而且无论如何必胜),

因为先手必须要拿走这一个。

如果总共2枚硬币,则先手有必胜策略,即,首先拿走一个,剩下一个,

则后手只能拿走最后一个,后手输。

利用三叉树解决这个问题。

用一颗三叉树代表一次游戏的所有可能过程,每一个节点代表一个当前的游戏状态。

每个节点有三颗子树,其中左孩子代表从当前的硬币堆中拿走1枚,中孩子代表拿走2个,

右孩子代表拿走三个。

每个节点除了存储三个子树(左中右)的指针外,还需要存储:

1.       当前剩余硬币枚数

2.       此节点的who_could_win属性,即对于此节点所对应的状态,先手有必胜策略还是后手有必胜策略,规定当剩余硬币数为0时,先手有必胜策略。根据以下两个原则,整棵树各个节点的who_could_win属性可以由底到根递归求得:

a)         若节点存在子树,且子节点的who_could_win属性均为“先手有必胜策略”,则此节点有后手必胜策略

b)        若节点不存在子树(剩余硬币为0),或者存在的子树中含有who_could_win属性为“后手有必胜策略”的,则此节点有先手必胜策略。


另外一种更简便的方式, 

用f(n)代表 n个硬币时,谁能必胜  f(n)=先 或者f(n)=后


n123456789
f(n)


假设小张先取,每次最多可以取的硬币数为5枚,问小张是否有必胜策略? 这个问题可以通过数学法来解决。我们先看一下比较简单的情况,如果只有100枚硬币,每次最多取5枚,那么小张可以通过以下策略保证必胜: 1. 如果剩下的硬币数模6等于1或2,小张先取1或2枚,然后每次取硬币数与对手取的上一次硬币数之和为6,这样小张一定可以在最后一次取完后取到最后一枚硬币。 2. 如果剩下的硬币数模6等于3或4或5,小张先取4或3或2枚,然后每次取硬币数与对手取的上一次硬币数之和为6,这样小张也可以在最后一次取完后取到最后一枚硬币。 接下来我们考虑2021枚硬币的情况。我们可以先通过模6来进行分类讨论: 1. 如果剩下的硬币数模6等于1或2,小张可以采用与100枚硬币相同的策略,即先取1或2枚,然后每次取硬币数与对手取的上一次硬币数之和为6。 2. 如果剩下的硬币数模6等于3,小张可以先取2枚,然后每次取硬币数与对手取的上一次硬币数之和为6。这样小张可以在最后一次取完后留下4枚硬币,从而取胜。 3. 如果剩下的硬币数模6等于4,小张可以先取1枚,然后每次取硬币数与对手取的上一次硬币数之和为6。这样小张可以在最后一次取完后留下3枚硬币,从而取胜。 4. 如果剩下的硬币数模6等于5,小张可以先取4枚,然后每次取硬币数与对手取的上一次硬币数之和为6。这样小张可以在最后一次取完后留下1枚硬币,从而取胜。 5. 如果剩下的硬币数模6等于0,小张可以先取5枚,然后每次取硬币数与对手取的上一次硬币数之和为6。这样小张可以在最后一次取完后留下1枚硬币,从而取胜。 因此,小张有必胜策略。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值