由高僧斗法所想到.docxVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
由高僧斗法所想到

由高僧斗法所想到…摘要:这是博弈问题,组合数据,Nim游戏的变异,阶梯博弈的变种,高僧斗法。最重要三点:异或运行,奇数堆堆,必胜局Nim游戏 HYPERLINK /archives/547 /archives/547桌面上有三行硬币,每一行中分别有a1、a2、a3个硬币,其中a1、a2、a3是可以任意指定的正整数。两个人轮流拿走硬币,每一次只能从某一行中拿走任意多个硬币,谁拿走最后一枚硬币谁就赢了。Nim游戏(又名取石子问题)必胜策略可不是那么好想的。Nim游戏是组合游戏(Combinatorial Games)的一种,准确来说,属于“Impartial Combinatori Games”(以下简称 ICG)。德国的 nimm意思是“采取[必要]”或过时的英语动词NIM的含义相同。最早欧洲引用稔是从16世纪初,这个游戏很久以前就已经有了,可是必胜策略直至20世纪初才被哈佛大学的一个叫做Charles Leonard Bouton的数学家找到,可见其思维难度;可是,这个必胜策略却只要由一个运算就搞定了:Xor(异或)运算,可见Xor运算之神奇。Xor运算的神奇性质之一,就是他自己是自己的逆运算,即对于任何两个布尔变量或者数有(a Xor b)Xor b=a。void swap(int a, int b){a=a+b; b=a-b; a=a-b;}void swap(int a, int b)//我们讲过!{a=a^b; b=a^b; a=a^b;}现在给你2n+1个正整数,其中有n对数和1个单独的数,(这里规定一对数的意思是这两个数相等),然后让你设计一种算法,把这个单独的数给找出来,要求时间复杂度为O(n)。比如说这2n+1个数是1 2 3 2 1,那么这个单独的数就是3。如果你的思路是依次挑出一个数然后和其余所有数比较一下看看是否相等,那就换个思路吧,因为这样的时间复杂度是O(n2)的。——1Xor2Xor3Xor2Xor1就一定是3了。就这么简单!当硬盘的一个部分损坏之后可以推算出来损坏部分数据!Xor的第二个神奇性质,是他满足消去率,即由a Xor c=b Xor c可以推出a=b,可以用上面一条性质轻松验证。必败态。其严格定义如下:1.无法进行任何移动的局面是必败态;2.可以移动到必败态的局面是非必败态;3.在必败态做的所有操作的结果都是非必败态。这个还是很好理解的吧,就是自己处在非必败态上总能移动到必败态把必败态留给对方,而对方处在必败态的话总是只能移动到非必败态,把非必败态留给自己,然后自己继续虐对方。而对于Nim游戏,局面是必败态当且仅当所有堆硬币的数量都异或起来结果为0,即a1^a2^...^an=0!!!为了证明之,我们只要证明它满足上述必败态的三条性质即可。第一个命题显然,最终局面只有一个,就是全0,异或仍然是0。第二个命题,对于某个局面(a1,a2,...,an),若a1^a2^...^an!=0(不等号就用C++的习惯用!=来表示了),一定存在某个合法的移动,将ai改变成ai后满足a1^a2^...^ai^...^an=0。不妨设a1^a2^...^an=k,则一定存在某个ai,它的二进制表示在k的最高位上是1(否则k的最高位那个1是怎么得到的)。这时ai^kai一定成立。则我们可以将ai改变成ai=ai^k,此时a1^a2^...^ai^...^an=a1^a2^...^an^k=0。第三个命题,对于某个局面(a1,a2,...,an),若a1^a2^...^an=0,一定不存在某个合法的移动,将ai改变成ai后满足a1^a2^...^ai^...^an=0。因为异或运算满足消去率,由a1^a2^...^an=a1^a2^...^ai^...^an可以得到ai=ai。所以将ai改变成ai不是一个合法的移动。证毕。#include stdio.hvoid main(){ int a,b[100],i,c; scanf(%d,a); for(i=0;ia;i++) scanf(%d,b[i]); c=0; for(i=0;ia;i++) { c=c^b[i];//!!!!!! } if(c==0) printf(后手赢/n); else printf(先手赢/n);}先手的人如果想赢,可以有几种选择:#include stdio.hvoid main(){ int a,b[100],i,c,d,h,j; scanf(%d,a); for(i=0;ia;i++) scanf(%d,b[i]); d=0; for(i=0;ia;i++) { for(j=0;j=b[i];j++) { c=b[i]-j; h=0; while(ha) { if(h!=i) {

文档评论(0)

peain + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档