一BASH博弈
详情从一堆n个物品中,两个人从这堆物品中取物,规定每次至少取一个,最对取m个。最后取光者胜
理解:1若n=m+1则,无论先取者拿走多少,后取者就一定能一次全部拿走
2 n=(m+1)*k+s 先取者拿走s个,对于m+1情况同一,所以说 肯定先取者获胜
变形:l两人轮流报数,每次至少报一个,最多报10个,谁先报到100者胜
分析此类题目的通用方法:
P点:必败点
N点:必胜点
三个定理: 1 所有的终结点都是必败点P
2所有一步都能走到必败点P标记为N点
3通过一步操作只能到N点的就是P点
二:非不垃圾博弈 取走最后一个为胜 先首胜肯定不是非不垃圾数列
描述:从一堆个数为n的石子中,双方轮流取石子满足:
1;先手不能一次把石子全取完
2:之后每次可以取得石子介于1到对手刚去的石子数的2倍之间(包含1,和2倍)
例如:每次取完最后里面的最后一颗
代码实现:可以先将非不垃圾数列打表打出来 然后判断n是否和a[i]相等
三:威佐夫博弈 非奇异局势,先取者 胜
描述:从两堆个若干的物品中,两人轮流从某一堆或者同时从两堆中取同样多的物品,规定每次至少取一个,多者不限
最后取光者 胜;
判断:面对非奇异局势先者胜
判断奇异局势: 假设 a<b;
a==floor((b-a)*(1+sqrt(5))/2) 相等的话就是 奇异局势
四:尼姆博奕http://blog.csdn.net/u013514928/article/details/69055286
先手获胜策略:先手能够在非平衡尼姆博奕中获胜 后手能够在尼姆博奕中获胜 HDOJ1850
最后取光者胜
0 ^ 1 得 1
1 ^ 1 得 0
0 ^ 0 得 0
for(i=0;i<n;i++)
{
int k=ans^a[i];//两个相同的值 进行 ^ 是从这个 ^总和中踢出去这个a[i]
if(k<a[i]) //重点!! a[i]-k 就是从某堆中去掉某个东西使得 ans为偶数 所以说这个k就是剩下的东西了
cout<<a[i]<<" "<<k<<endl; //重点!! 这儿没有理解啊!!!1
}