1.游戏规则

有两堆石子,数量任意,可以不同。游戏开始由两个人轮流取石子(至少取1个)。

每次有两种不同的取法,规则如下:
1.一是可以在任意的一堆中取走任意多的石子;

2.二是可以在两堆中同时取走相同数量的石子。

最后把石子全部取完者为胜者,假设双方都采取最好的策略,给定初始数量,你是否有必胜的把握?

2.分析

为方便描述,设f[x,y]表示两堆石子数量分别为x,y,且你先取。
1.f[x,y]=1表示必胜
2.f[x,y]=0表示必败
3.石堆没有顺序优先级,所以f[x,y]=f[y,x]

2.1首先分析3种特殊情况

1.两堆石子数量一样,两堆都取n个,必胜,得f[n,n]=1

2.只有一堆石子,一堆取n个,必胜,得f[n,0]=f[0,n]=1

3.石子数量为f[2,1],只能取(1,0),(2,0),(1,1),剩下石子为(1,1),(0,1),(1,0)对方都能胜,所以必败,得f[2,1]=f[1,2]=0,称此为奇异局势(必败局势)。

2.2列出前面的几种情况如下:

可以得到如下规律:

  • 奇异局势有f[2,1],f[5,3],f[7,4],f[10,6]...,必败

  • 蓝色为先取的数量,一次就可以将状态转为奇异局势,必胜

  • f[x+1,x],f[1,x],f[2,x]都可以转为f[2,1],必胜

  • f[x+2,x],f[3,x],f[5,x]都可以转为f[5,3],必胜

  • f[x+k,x]可以转化为f[x1,y1],x1-y1=k的奇异局势,而且f[x1,x],f[y1,x]也可以转化为f[x1,y1]

即奇异局势为f[x,y],|x-y|=1,2,3,4,x,y为正整数,且x,y不能重复出现
结论:如果两个人都采取最优策略,面对非奇异局势,先拿必胜;面对奇异局势,后拿必胜。

3.理论推广

这个其实是经典的威佐夫博弈问题,但首先我们先介绍另一个定理,贝蒂定理。

3.1贝蒂定理

3.2回归威佐夫问题

3.3如何快速判断

3.4例题

poj1067:http://poj.org/problem?id=1067

3.5代码实现

const double q = (1 + sqrt(5.0)) / 2.0;bool isWythoff(int a, int b) {int t;if (a > b) t = a, a = b, b = t;return (int) ((b - a) * q) == a;}

关注我,涨知识,公众号:几何思维

取石子游戏,威佐夫博弈的推理相关推荐

  1. 洛谷P2252 取石子游戏(威佐夫博弈)

    题目背景 无 题目描述 有两堆石子,数量任意,可以不同.游戏开始由两个人轮流取石子.游戏规定,每次有两种不同的取法,一是可以在任意的一堆中取走任意多的石子:二是可以在两堆中同时取走相同数量的石子.最后 ...

  2. HDU - 1527 取石子游戏(威佐夫博弈)

    题目链接:点击查看 题目大意:有两堆石子,两个人轮流取,每次可以取一堆中任意多的石子,或者取两堆中数量相同的石子,先将石子取完者获胜,若先手获胜输出1,后手获胜输出0 题目分析:这个题目涉及到了威佐夫 ...

  3. 取两堆石子(威佐夫博弈)

    有两堆石子,数量任意,可以不同.游戏开始由两个人轮流取石子.游戏规定,每次有两种不同的取法, 一是可以在任意的一堆中取走任意多的石子:二是可以在两堆中同时取走相同数量的石子.最后把石子全部取完者为胜者 ...

  4. 【HDU - 2516 】取石子游戏 (Fibonacci博弈)

    题干: 1堆石子有n个,两人轮流取.先取者第1次可以取任意多个,但不能全部取完.以后每次取的石子数不能超过上次取子数的2倍.取完者胜.先取者负输出"Second win".先取者胜 ...

  5. POJ1067 HDU1527 取石子游戏【博弈】

    取石子游戏 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Subm ...

  6. 威佐夫博弈:百练OJ:1067:取石子游戏

    威佐夫博弈(Wythoff's game):有两堆各若干个物品,两个人轮流从任一堆取至少一个或同时从两堆中取同样多的物品,规定每次至少取一个,多者不限,最后取光者得胜. 百练OJ:1067:取石子游戏 ...

  7. POJ-1067取石子游戏,威佐夫博弈范例题/NYOJ-161,主要在于这个黄金公式~~

    取石子游戏 Time Limit: 1000MS   Memory Limit: 10000K              Description 有两堆石子,数量任意,可以不同.游戏开始由两个人轮流取 ...

  8. 杭电acm 2177 取(2堆)石子游戏(威佐夫博弈)

    取(2堆)石子游戏                       Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 ...

  9. 【HDU - 1527】【POJ - 1067】取石子游戏 (威佐夫博弈)

    题干: 有两堆石子,数量任意,可以不同.游戏开始由两个人轮流取石子.游戏规定,每次有两种不同的取法,一是可以在任意的一堆中取走任意多的石子:二是可以在两堆中同时取走相同数量的石子.最后把石子全部取完者 ...

  10. POJ1067_取石子游戏_威佐夫博弈

    /* *State: 1067 Accepted 176K 16MS C++ 435B *题目大意: * 威佐夫博弈 *解题思路: * 略. */ #include <iostream> ...

最新文章

  1. python建站与java建站有何不同_详解模板建站和定制建站的不同之处
  2. python写计算器
  3. php在用js_encode()转换时,实现斜杠不转义
  4. Java中正则Matcher类的matches()、lookAt()和find()的差别
  5. 阿里巴巴集团CRO刘振飞:双11的六维技术准备
  6. armax函数 matlab 源码_将可读性不强的MATLAB公式样式转为直观的LaTeX样式
  7. php 7.2 兼容5.5吗,PHP5.5至PHP7.2 新特性整理
  8. Python有了concurrent的话mutiprocessing和threading还有存在的意义吗?
  9. android刷新时的圆形动画_Android动画篇(一):圆形进度条CircleProgressBar
  10. python语言程序设计赵璐课后答案_Python语言程序设计
  11. 永远的动漫,梦想在,就有远方
  12. 335x内核ddr3频率与电压修改
  13. 如何在PS(Adobe Photoshop)安装Portraiture3插件教程
  14. 一个人的职业生涯之旅 —— 应届生求职、面试、Offer、跳槽(发展瓶颈、薪资倒挂、职业倦怠、骑驴找马、简历优化)问题分享
  15. 细化算法matlab
  16. 360插件化踩坑记录(二),RePlugin安装、启动插件无反应
  17. jmeter性能测试并监控服务器
  18. 谷歌浏览器打印不弹出预览直接打印机打印
  19. c语言flag go to,C 语言getopt与go语言flag获取命令参数
  20. 为自己选一个网络硬盘

热门文章

  1. CVE-2017-11882:Microsoft office 公式编辑器 font name 字段栈溢出通杀漏洞调试分析
  2. window.opener 与 window.dialogArguments的用法
  3. 《Hibernate官方文档》_笔记
  4. Visual C++ 2010 Express中文版如何下载
  5. 停车场系统管理数据库设计说明书
  6. (切换多语言)vantUI+vue-i18n进行国际化配置及新增没有的语言包
  7. 移动设备数据丢失恢复办法
  8. Spring+Quartz实现文件中转站
  9. 科密t1消费管理系统_科密A1\T1登录密码获取软件-科密A1\T1登录密码获取工具1.0.0 安卓版-东坡下载...
  10. 全球互联网进入后美国时代:在世界互联网大会上的演讲