当前位置:   article > 正文

博弈论(巴什博奕,威佐夫博弈,尼姆博弈)_博弈论公式

博弈论公式

巴什博奕(Bash Game):

只有一堆n个物品,两个人轮流从中取物,规定每次最少取一个,最多取m个,最后取光者为胜

举一个最简单的例子就是,当n=m+1时,此时不管先手取多少,后手都能把剩下的取完,拓展到n等于m+1的倍数时,不管先手取多少,后手都可以取(m+1减去先手取的个数)个,最后先手一定会面临n=m+1的情况,此时先手必败,否则先手必胜

程序代码:

  1. #include<stdio.h>
  2. int main()
  3. {
  4. int n,m;
  5. while(scanf("%d%d",&n,&m)!=EOF)
  6. {
  7. if(n%(m+1)==0)
  8. printf("先手必败\n");
  9. else
  10. printf("先手必胜\n");
  11. }
  12. return 0;
  13. }

威佐夫博弈(Wythoff Game):

有两堆各若干的物品,两人轮流从其中一堆取至少一件物品,至多不限,或从两堆中同时取相同件物品,规定最后取完者胜利

这有一个公式:t=(int)((a-b)*(1.0+sqrt(5.0))/2.0);让t与较小堆石子数相比,如果相等先手必败,否则先手必胜

程序代码:

  1. #include<stdio.h>
  2. #include<math.h>
  3. int main()
  4. {
  5. int a,b,t;
  6. while(scanf("%d%d",&a,&b)!=EOF)
  7. {
  8. if(a<b)
  9. {
  10. a^=b;
  11. b^=a;
  12. a^=b;
  13. }
  14. t=(int)((a-b)*(1.0+sqrt(5.0))/2.0);
  15. if(t==b)
  16. printf("先手必败\n");
  17. else
  18. printf("先手必胜\n");
  19. }
  20. return 0;
  21. }

尼姆博弈(Nimm Game):

有任意堆物品,每堆物品的个数是任意的,双方轮流从中取物品,每一次只能从一堆物品中取部分或全部物品,最少取一件,取到最后一件物品的人获胜

把每堆物品数全部异或起来,如果得到的值为0,那么先手必败,否则先手必胜

程序代码:

  1. #include<stdio.h>
  2. int main()
  3. {
  4. int n,m,i,count;
  5. while(scanf("%d",&n)!=EOF)
  6. {
  7. count=0;
  8. for(i=0;i<n;i++)
  9. {
  10. scanf("%d",&m);
  11. count^=m;
  12. }
  13. if(count==0)
  14. printf("先手必败\n");
  15. else
  16. printf("先手必胜\n");
  17. }
  18. return 0;
  19. }

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/羊村懒王/article/detail/728736
推荐阅读
相关标签
  

闽ICP备14008679号