Nim Game,一个有趣的游戏,也是一道入门算法题。
Nim Game,其实很多人都玩过。其实就是我们玩的划线游戏。
一张纸上,画若干条线,双方一人划一次,每次划掉1~3条线。可以选择画1条,也可以划2条,也可以3条。具体划去几条线完全看自己的策略。谁划掉最后一条线,就是赢家。
如上图,蓝方获胜。
正在看这篇文章的你一定是一个聪明人,每一步都是最优解,而你的对手,也跟你一样聪明,每步都是最优的解法。
现在你作为先手,在线条总数为多少的时候,你必赢呢,又在多少的时候必输呢?
可不可以用一个函数来判断在线条总是为x时你的输赢情况呢?这样你以后跟别人玩这个游戏的时候就不会输啦。
答案是可以,不过我们要先来分析一下这个问题。
在线的总是为多少的时候一定会输呢。
每人每步最多划三条线,所以线的总是至少为4条。当线的总数为4条的时候,不管先手划几条线,后手都有应对的方法,先手必输。
所以你会发现8条也是必输,8条线可以分成两个部分,每个部分四条线。自然先手还是必输。4这个数字还真是不太吉利。
当线的总数为5条的时候,先手先划掉一条线,后手就等于是在4条线的情况下先手,自然后手输。
而6条 7条 先手都可以划掉2条线和3条线来让后手落入“4”的陷阱。
所以我们可以看出,我们只要远离”4“就行了。当线的总数不是4的倍数的时候,先手必赢。
看到这里,恭喜你掌握了必胜法则,下次各位盆宇就可以用这个游戏跟别人打赌了。
所以现在我们可以将我们的结论写到代码里了。
在这里我将实现一个C语言的函数:
bool canWin(int n) {
return n%4;
}
参数 n 代表的是线条的总数。 通过线条总是是否能被4整除来判断这场比赛中作为先手的你必赢还是必输。
当 n%4 的结果为0时意味着n能被4整除,返回0,转换为布尔值为false。
当n%4不等于0时意味这n不能被4整除,返回非0,转换为布尔值为true。
最新文章
- iOS编译FFmpeg、kxmovie实现视频播放 (转载)
- MongoDB学习
- android view : 绘制
- ASP.NET中实现Session的负载均衡
- 18 BufferedReader使用方法
- EasyUI关于 numberbox,combobox,validatebox 的几个小问题
- 分布式数据库 HBase
- 基于apt实现的Android快速持久化框架:AptPreferences
- 比RBAC更好的权限认证方式(Auth类认证)
- 转: ORACLE索引介绍和使用
- “菜单”(menubar)和“工具栏”(toolbars)
- c语言文件分割与合并
- 算法-java代码实现归并排序
- 7I - 数塔
- C# 封装SqlHelper
- SSM 开发 Tars
- cocos2d JS-(JavaScript) JavaScript 中的简单继承关系
- C#中的IDisposable接口
- django之Q
- MMS从Contacts中添加收件人显示email账号
热门文章
- c++ 算法 栅格中两点之间连线
- c++ 容器元素填充指定数量的元素(generate_n)
- MAC下Java安装之后的路径
- Python day13文件的读写
- Spring AMQP 源码分析 02 - CachingConnectionFactory
- Spring AMQP 源码分析 01 - Impatient
- php7-soap调用wsdl接口报错:Could not connect to host
- Yii中的CComponent应用实例
- python 在 Windows Server 2008 r2 上 安装失败
- android--------AndroidStudio 关闭 Install Run