poj1067解题报告(某大牛)

/*

 *威佐夫博奕(Wythoff Game): 有两堆各若干个物品,两个人轮流从某一堆或同时从两

 *堆中取同样多的物品,规定每次至少取一个,多者不限,最后取光者得胜.

 *(ak,bk)(ak  bk ,k=0,1,2,...,n)表示两堆物品的数量,则

 *奇异局面(先手必败, P-Position) ak =[k(1+5)/2], bk= ak + k (k=0,1,2,...,n 方括

 *号表示取整函数)

 */

以下是极为简短代码

 

#include <iostream>

#include
<string>

#include
<algorithm>

#include
<cmath>

#include
<vector>



using namespace std;



const double q = (1 + sqrt(5.0)) / 2.0; // 黄金分割数



int Wythoff(int a, int b)

{

if (a > b)swap(a, b);

int k = b - a;

if (a == (int)(k * q))return 0; // 奇异局面, 先手必败, P-Position

return 1;

}



int main ()

{

int a, b;

while (scanf("%d%d", &a, &b) != EOF)

{

printf(
"%d\n", Wythoff(a, b));

}

}

posted @ 2011-06-06 19:50  JustDoIt0  阅读(349)  评论(0编辑  收藏  举报