博弈论之威佐夫博弈

威佐夫博弈(Wythoff Game):

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

结论 :

  设两堆物品初值为 (x,y) 且 x>y ;

  令 z = floor((sqrt(5.0)  + 1) / 2.0) * (x - y);

  若 w == y,则后手必胜 , 否则先手必胜;

参考了(威佐夫博弈详解)http://blog.csdn.net/y990041769/article/details/21694007

code :  

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cmath>
 4 //define swap(x,y) x ^= y , y ^= x , x ^= y;
 5 using namespace std;
 6 
 7 int main()
 8 {
 9     int x , y , z;
10     while(~scanf("%d%d",&x,&y))
11     {
12         if(x < y)  
13             swap(x,y) ;
14         z = floor((sqrt(5.0) + 1) / 2.0)*(x - y));
15         if(z == y) 
16             printf("后手必胜
");
17         else 
18             printf("先手必胜
");
19     }
20 return 0;
21 }    
原文地址:https://www.cnblogs.com/x-1204729564/p/5789809.html