博弈论之威佐夫博弈
威佐夫博弈(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("后手必胜\n"); 17 else 18 printf("先手必胜\n"); 19 } 20 return 0; 21 }