博弈
先占个坑 等做了题再慢慢添加东西
先来个干货 大神的博弈小结
做个笔记:
规定: 利己状态定义为T(非奇异局势)
利他状态定义为S(奇异局势)
重要结论: T可转化为(S,T),S只能转化为(T) 非奇异局势一定可以转化为奇异局势和非奇异局势,而奇异局势只能转化为非奇异局势
经典博弈:
1.Bash Game 巴什博弈
有一堆数量为n的石子 2个人轮流取m(m>=1&&m<=n)个石子,取完者获胜
我们可以很容易的找到一个必败态 (下文必胜必败都是针对先手)即n=m+1时
因为无论先手取多少石子,后手都可以取完
然后我们可以假设一个必败态 n=(m+1)*k(k=1,2,3....)
证明:
当k=1时显然成立
当k=2时,无论先手取多少石块,后手都可以使状态达到n=m+1 即k=1的状态
当k=3时,无论先手取多少石块,后手都可以使状态达到n=(m+1)*2 即k=2时的状态
。。。
当k=x时,无论先手取多少石块,后手都可以使状态达到n=(m+1)*(x-1) 即k=x-1的状态
证毕,假设成立
由此我们可以得到一个结论 即 在Bash Game中
n=(m+1)*k(k=1,2,3...)先手必败
n=(m+1)*k+s(k=1,2,3...1=<s<=m) 先手必胜
2.Wythoff Game 威佐夫博弈(转自Demon)
有两堆各若干个物品,两个人轮流从某一堆或同时从两堆中取同样多的物品,规定每次至少取一个,多者不限,最后取完者得胜。这种情况下是颇为复杂的。
可以用两个数(a[k],b[k])(ps:(a[k]≤b[k])k为一个自然数)表示两堆物品的数量。如果该数量为奇异局势,那么先手输;
前几个奇异局势如下:(0,0,)、(1,2)、(3,5)、(4,7)、(6,10)······起始值a[0]=b[0]=0;k=0;
可以看出a[k]是在之前未出现过的最小自然数,而b[k] = a[k]+k,k代表出现的第几个奇异局势;
性质:
1.任何自然数都包含在一个且仅有一个的奇异局势中。
证明:若(a[k],b[k])为一个奇异局势,因为b[k]=a[k]+k,a[k]>a[k-1] =》 b[k] >a[k-1]+k >a[k-1]+k-1 =》 b[k-1] > a[k-1].
2.任何操作都会将奇异局势变成非奇异局势
由性质1可知,即使是同时减少,两个数的差值不变,所以不可能成为其他奇异局势的差,因此也是非奇异局势;
3.可采用适当的方法将非奇异局势变为奇异局势,那么下一个必输;
结论:两个人如果都采用正确操作,那么面对非奇异局势,先拿者必胜;反之,则后拿者取胜。
那么任给一个局势(a,b),怎样判断它是不是奇异局势呢?
我们有如下公式:a表示第一堆的个数,b表示第二堆的个数,c表示二者之差,当然a必须小于b;
再找规律的话我们会发现,a= c* 1.618
而1.618 = (sqrt(5)+ 1) / 2 。
大家都知道0.618是黄金分割率。而威佐夫博弈正好是1.618,这就是博弈的奇妙之处!
AC代码 直接用1.618会wa 不知道为什么 还是用 (sqrt(5.0)+1.0)/2.0;
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include "stdio.h" 2 #include "cmath" 3 #define min(a,b) a < b ? a : b 4 using namespace std; 5 6 int main() 7 { 8 int a,b,c,m; 9 while(scanf("%d%d",&a,&b)!=EOF) 10 { 11 m=min(a,b); 12 int p=(int)(abs(a-b)*(sqrt(5.0)+1.0)/2.0); 13 printf("%d\n",m==p ? 0 : 1); 14 } 15 return 0; 16 }
3.Nimm Game 尼姆博弈
n堆石块 每堆xi块 每次可以取走一堆的任意块 或者同时取走2堆的数量相同的石头
这里可以用异或大家都知道 可是为什么可以用异或 在这里讨论一下
先了解一下异或运算--
异或又称做没有进位的加法 故名思意 例如二进制 1+1 = 10 不进位 则 1+1=(1) 0 == 0 ,1+0=1,0+1=1,0+0=0;
那么在尼姆博弈里异或 的意义是什么呢?
又异或性质可知,一个数异或本身等于0,也就是2个相同的数异或和为0,任意数异或0等于它本身
也就是说,在尼姆博弈里,如果出现了2个相同数量的石堆,那么他们之间异或等于0,也就是可以理解为2堆数量相同的石堆无论数量多少对博弈的结果没有影响
如果还不太理解我们可以这样理解;
假设有n堆石块,且这n堆石块数量各不同,现在加入2堆数量相同的石块
现在单独讨论这2堆石块,假设在第一堆中 A为先手,且A最终拿完这一堆(无论中间过程怎么拿),然后在另一堆中变成了B为先手,显然在这一堆中B最终能拿完这一堆
现在回到整个博弈,B拿完第二堆的时候A变成了先手,是不是回到了最开始,感觉很神奇?其实不,仔细想一想是可以想明白的
同理出现过偶数堆的都对结果没有影响