题目链接:

http://acm.hdu.edu.cn/showproblem.php?pid=1527

题目描述:

有两堆石子,数量任意,可以不同。游戏开始由两个人轮流取石子。游戏规定,每次有两种不同的取法,一是可以在任意的一堆中取走任意多的石子;二是可以在两堆中同时取走相同数量的石子。最后把石子全部取完者为胜者。现在给出初始的两堆石子的数目,如果轮到你先取,假设双方都采取最好的策略,问最后你是胜者还是败者。

首先介绍一下威佐夫博弈(Wythoff Game)的概念:

有两堆各若干个物品,两个人轮流从某一堆或同时从两堆中取同样多的物品,规定每次至少取一个,多者不限,最后取光者得胜。

性质:两个人如果都采用正确操作,那么面对非奇异局势,先拿者必胜;反之,则后拿者取胜。

判断是否为奇异局势:任给一个局势(a,b), (下面用到的a是两者中较小的数)ak =[k(1+√5)/2],bk= ak + k  (k=0,1,2,…,n 方括号表示取整函数)

奇妙的是其中出现了黄金分割数(1+√5)/2 = 1。618…,因此,由ak,bk组成的矩形近似为黄金矩形,由于2/(1+√5)=(√5-1)/2,可以先求出j=[a(√5-1)/2],

若a=[j(1+√5)/2],那么a = aj,bj = aj + j,若不等于,那么a = aj+1,bj+1 = aj+1+ j + 1,

若都不是,那么就不是奇异局势。然后再按照上述法则进行,一定会遇到奇异局势。

我们再用具体的数值说明一下:

当面对(0,0)时很显然我们是处于必败的状态,而下一个该状态即(1,2)

因为无论我们做(0,2)(1,1)(1,0)那种操作对方都能使我们变成(0,0)

以此类推,前几个奇异局势是:(0,0)、(1,2)、(3,5)、(4,7)、(6,10)、(8,13)、(9,15)、(11,18)、(12,20)。

而他们的差值就是0,1,2,3,4,5,6,7……

所以第一个值 = 差值 * 1.618满足黄金分割数的比例。

这是为什么呢?

首先,若 (x, y) 是必败态,那么(x+i,y),((x,y+i)肯定是必胜态,因为我可以通过拿去i个石子使其变成(x,y)

这也就说明了,以后的必败态绝对不会再出现x、y。因为如果出现,我可以通过改变另一个值使它变为(x,y),那么就不是必败态了。

首先,假设我们得到状态 (a[i] - p, a[i] - p + y),并且比 a[i] 小的数都在之前出现过,若 a[i] - p 存在必败态 ,那么当前状态 (a[i] - p, a[i] - p + y)肯定是必胜态了

若 a[i] - p 出现在较大的数,由于小数是单增的,因而其对应的小数必小于 a[i] + y,故而也可推出其状态为必胜态。

于是,(a[i], a[i] +y) 状态的胜负性只与状态 (a[i], a[i] + d) (d <y) 有关。不难看出,y= i 时恰为必败态,因为不论从第二堆中取出多少个石子,作为另一堆的第一堆石子并没有在之

前出现过,所以得到的一定是一个必胜态,因而 (a[i], a[i] + y) 为必败态,即矩阵i 个必败态大数等于小数加上 i。

所以差值就是0,1,2,3,4,5,6,7……了

#include<stdio.h>
#include<math.h>
int main()
{int a,b;while(~scanf("%d%d",&a,&b)){double j,k,r;int t;if(a>b){t=a;a=b;b=t;}r=(sqrt(5.0)-1)/2;j=(int)(r*a);if(a!=(int)(j/r))j+=1;if(b!=(int)(j/r)+j)printf("1\n");elseprintf("0\n");}return 0;
}

题目链接:

http://acm.hdu.edu.cn/showproblem.php?pid=2177

原理相同

#include<stdio.h>
#include<math.h>
int main()
{int a,b;while(~scanf("%d%d",&a,&b)&&(a||b)){double j,k,r,x;int i,n,m,m_n;int t;if(a>b){t=a;a=b;b=t;}r=(sqrt(5.0)-1)/2;x=r+1;j=(int)(r*a);if(a!=(int)(j/r))j+=1;if(b==(int)(j/r)+j)printf("0\n");else{printf("1\n");for(i=1;i<=a;i++){n=a-i;m=b-i;m_n=m-n;if((int)(m_n*x)==n)printf("%d %d\n",n,m);}for(i=b-1;i>=0;i--){n=a;m=i;if(n>m){t=n;n=m;m=t;}m_n=m-n;if((int)(m_n*x)==n)printf("%d %d\n",n,m);}}}return 0;
}

博弈——威佐夫博弈(hdu1527,2177)相关推荐

  1. HDU 5754 博弈(威佐夫博弈)

    这个题除了皇后的可以套用一下威佐夫博弈以外其他的都可以找规律找出来,主要为了学习一下威佐夫博弈, 威佐夫博弈:给两堆石子,每次都可以从其中一堆石子中取n个石子或者从两堆石子中都取n个石子,最后将石子取 ...

  2. 博弈基础与例题分析(巴什博弈威佐夫博弈尼姆博奕 斐波那契博弈SG博弈)

    文章目录 巴什博弈Bash Game 威佐夫博弈Wythoff Game 尼姆博奕 斐波那契博弈:算法如其名 SG博弈 图 mex(minimal excludant)运算 获得sg表 应用 A Br ...

  3. 巴什博弈+威佐夫博弈

    1.巴什博弈(Bash Game) 只有一堆n个物品,两个人轮流从这堆物品中取物,规定每次至少取一个,最多取m个. 最后取光者胜 若n%(m+1)==0,后手必胜,反之,先手必胜. 最后取光着输 当( ...

  4. 数学基础(四)博弈论(巴什博弈~威佐夫博弈(黄金分割率)~尼姆博奕~斐波那契博弈~SG函数模板)

    一.巴什博弈 1.问题模型 只有一堆n个物品,两个人轮流从这堆物品中取物,规定每次至少取一个,最多取m个,最后取光者得胜. 2.解决思路: 当n=m+1时,由于一次最多只能取m个,所以无论先取者拿走多 ...

  5. 博弈论入门之威佐夫博弈

    威佐夫博弈 威佐夫博弈是一类经典的博弈问题 有两堆石子,两个顶尖聪明的人在玩游戏,每次每个人可以从任意一堆石子中取任意多的石子或者从两堆石子中取同样多的石子,不能取得人输,分析谁会获得胜利 博弈分析 ...

  6. hdu 2177 威佐夫博弈

    题目链接:hdu 2177 威佐夫博弈水题,如果不是奇异局势需要输出走完第一步石堆的状态,先按两堆取相同石子,再按只取一堆. 可以打表解决 #include<iostream> #incl ...

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

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

  8. hdu2177——威佐夫博弈变形

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2177 有两堆石子,数量任意,可以不同.游戏开始由两个人轮流取石子.游戏规定,每次有两种不同的取法,一是 ...

  9. 【博弈论】威佐夫博弈

    简介 威佐夫博弈( W y t h o f f G a m e Wythoff\ Game Wythoff Game):有两堆物品个数是 n n n和 m m m,甲乙两个人轮流从一堆选取 k k k ...

最新文章

  1. linux 内存管理slab源码,Linux内核源代码情景分析-内存管理之slab-回收
  2. 关于合并“.a”文件时遇到的问题
  3. IntelliJ IDEA 2018.1正式发布!什么?还能这么玩?
  4. debian 重复执行sh_debian 脚本启动方式
  5. 最全数据结构详述: List VS IEnumerable VS IQueryable VS ICollection VS IDictionary
  6. 突然!新锤子手机系统现身:这是另起炉灶了?
  7. SAP License:SAP成本收集器两则
  8. 算法导论笔记:32字符串匹配算法
  9. VC开发过程中数据类型不兼容的问题
  10. BZOJ2728 HNOI2012与非(并查集+数位dp)
  11. Excel隐身术了解一下,让自己的数据更安全
  12. 2018电大计算机操作题怎么评分,2018年度电大专科计算机应用基础学习知识win7系统上机操作技巧题操作技巧.doc...
  13. Oceanbase和TiDB粗浅对比之 - 执行计划
  14. 用户留存统计 java_用户留存率以及DNU、DAU、WAU、MAU关系
  15. 网页版电子表格控件tmlxSpreadsheet免费下载地址
  16. HDMI 网线延长器
  17. macbook有什么好用的软件吗?macbook上好用的软件推荐
  18. AttributeError: ‘HistGradientBoostingClassifier‘ object has no attribute ‘_n_features‘
  19. 1.去色快捷键,2.怎么复制图层,并且偏移呢
  20. Android拨号器---熟练控件与布局的应用

热门文章

  1. 11 MM配置-主数据-定义物料类型的编码范围
  2. 57 FI配置-财务会计-固定资产-资产数据传输-定义传输日期和附加参数
  3. Linux vsftpd(ftp)安装包安装方法
  4. python调用matlab函数_从 Python 调用 MATLAB 函数的三种方法
  5. pycharm导入本地py文件时,模块下方出现红色波浪线
  6. 超详细springboot热部署
  7. 自动论文生成器 python_python生成器
  8. WordPress主题-Qinmei视频主题3.0版本
  9. 养鸡农场小程序游戏京东拼多多优惠券附近商家流量主购物源码-修复登录接口
  10. java 运行war_javaweb项目在Eclipse中启动Tomcat后运行正常,但是打成war包启动后运行异常的问题?...