一道博弈的面试题及其算法正确性证明
2015-09-13 23:30
489 查看
题目是这样子的:一堆石子有N个,两个人轮流取石头,限制条件如下:
每个人一次只能取1~3个石头。
假设两人足够聪明(如果可以胜利,不会放水或者愚蠢的取石头)
胜负条件是最后取完石头的人算输(甲取完,石头正好没了,甲输),那么对于先取石头的人来说,怎么样的石头数量才能保证其一定赢得游戏,或者输掉游戏。
这道题目算是一个简单的博弈问题,分析问题的基础情况,记先取的人必赢为MW(Must Win),先取的人必输为ML(Must Lose):
N=1:ML。
N=2:MW(先取者只需取一个,即可获胜)。
N=3 : MW (先取者只需取两个,即可获胜)。
N=4:MW(先取者只需取三个,即可获胜)。
N=5:ML(无论先取几个,实际上留下的石头数量都会使后取者到达必赢得位置上)。
N=6:MW(先取者先取一个,使后取者被推到必输的位置上)
……
从上面的推理我们可以看出,博弈获胜的关键在于,N的数量决定了先取者是否能获胜,可以列出ML的时候,N=1,5,9,13.。。,即N满足N%4=1的时候,先取者必输,因为在这些点上,先取者无论用怎样的策略都会使对方进到必赢得位置上,那么如何来证明这个猜想的正确性呢?
在面试的时候,我们自然的先由以上简单的尝试来寻找规律,当总结出规律进行验证时,采用数学归纳法进行验证:
当N=1的时候,很明显ML。
假设当N%4=1的时候,ML成立。
当(N+4)%4=1的时候,有以下三种情况:先取一个,剩下N+3个石头不满足式子,后取者进入必赢模式;先取两个和先取三个同理可得。则所推公式正确性得证。
那么如果取1~K个石头,同样也可以得到关键公式为N%(k+1)=1;
考虑这类博弈问题的一个关键点就在于:
1. 对于所有的MW模式,一定存在一个MW模式到ML模式的转换。
2. 对于所有的ML模式,对于所有的转换都是ML模式到MW模式。
把握好这两个特性,便可在面试遇到这类问题时比较思路清晰的分析问题了。
每个人一次只能取1~3个石头。
假设两人足够聪明(如果可以胜利,不会放水或者愚蠢的取石头)
胜负条件是最后取完石头的人算输(甲取完,石头正好没了,甲输),那么对于先取石头的人来说,怎么样的石头数量才能保证其一定赢得游戏,或者输掉游戏。
这道题目算是一个简单的博弈问题,分析问题的基础情况,记先取的人必赢为MW(Must Win),先取的人必输为ML(Must Lose):
N=1:ML。
N=2:MW(先取者只需取一个,即可获胜)。
N=3 : MW (先取者只需取两个,即可获胜)。
N=4:MW(先取者只需取三个,即可获胜)。
N=5:ML(无论先取几个,实际上留下的石头数量都会使后取者到达必赢得位置上)。
N=6:MW(先取者先取一个,使后取者被推到必输的位置上)
……
从上面的推理我们可以看出,博弈获胜的关键在于,N的数量决定了先取者是否能获胜,可以列出ML的时候,N=1,5,9,13.。。,即N满足N%4=1的时候,先取者必输,因为在这些点上,先取者无论用怎样的策略都会使对方进到必赢得位置上,那么如何来证明这个猜想的正确性呢?
在面试的时候,我们自然的先由以上简单的尝试来寻找规律,当总结出规律进行验证时,采用数学归纳法进行验证:
当N=1的时候,很明显ML。
假设当N%4=1的时候,ML成立。
当(N+4)%4=1的时候,有以下三种情况:先取一个,剩下N+3个石头不满足式子,后取者进入必赢模式;先取两个和先取三个同理可得。则所推公式正确性得证。
那么如果取1~K个石头,同样也可以得到关键公式为N%(k+1)=1;
考虑这类博弈问题的一个关键点就在于:
1. 对于所有的MW模式,一定存在一个MW模式到ML模式的转换。
2. 对于所有的ML模式,对于所有的转换都是ML模式到MW模式。
把握好这两个特性,便可在面试遇到这类问题时比较思路清晰的分析问题了。
相关文章推荐
- 一个关于if else容易迷惑的问题
- 动易2006序列号破解算法公布
- Ruby实现的矩阵连乘算法
- C#插入法排序算法实例分析
- 一道sql面试题附答案
- 超大数据量存储常用数据库分表分库算法总结
- C#数据结构与算法揭秘二
- C#冒泡法排序算法实例分析
- C# 超高面试题收集整理
- 算法练习之从String.indexOf的模拟实现开始
- C#算法之关于大牛生小牛的问题
- C#实现的算24点游戏算法实例分析
- c语言实现的带通配符匹配算法
- 浅析STL中的常用算法
- 算法之排列算法与组合算法详解
- C++实现一维向量旋转算法
- Ruby实现的合并排序算法
- C#折半插入排序算法实现方法
- 基于C++实现的各种内部排序算法汇总
- C++线性时间的排序算法分析