编程之美 set 18 拈两堆石子游戏(3)

题目

假设有两堆石头, 有两个玩家按照如下规则轮流取石头

每个人每次可以从两堆石头中取出数量相等的石头, 或者仅从一堆石头中取出任意数量的石头

最后把剩下的石头依次拿光的人取胜

首先取石头的人能否赢得这个游戏

 

分析

1. 我们先定义先取者有必胜策略的局面为 "安全局面", 而先取者无必胜策略的局面为 "不安全局面"

2. 根据枚举 (10,10) 范围内石头的可能组合, 发现不安全局面的局面有 <1,2>, <3,5>, <4,7>...

3. 不安全局面的特点是 b = a + i, i = 1, 2, 3.., 若 a1, b1, ... an-1, bn-1 已经求得, 则定义 an 为未出现在这 2n-2 个数中的最小整数

4. 由以上的分析, 可以从下到上去推, 自底向上, 时间复杂度为 o(N)

5. 转化成数学问题, 求解通项公式, 时间复杂度降低到 o(1)

posted @ 2014-02-27 08:52  SangS  阅读(430)  评论(0编辑  收藏  举报