1. 程式人生 > >Hdu 1527 取石子游戲 (威佐夫博弈)

Hdu 1527 取石子游戲 (威佐夫博弈)

有兩堆石子,數量任意,可以不同。遊戲開始由兩個人輪流取石子。遊戲規定,每次有兩種不同的取法,一是可以在任意的一堆中取走任意多的石子;二是可以在兩堆中同時取走相同數量的石子。最後把石子全部取完者為勝者。現在給出初始的兩堆石子的數目,如果輪到你先取,假設雙方都採取最好的策略,問最後你是勝者還是敗者。 威佐夫博弈中必敗態即奇異局勢,

那麼任給一個局勢(a,b),怎樣判斷它是不是奇異局勢呢?我們有如下公式:

    ak =[k(1+√5)/2],bk= ak + k  (k=0,1,2,…,n 方括號表示取整函式)

奇妙的是其中出現了黃金分割數(1+√5)/2 = 1。618…,因此,由ak,bk組成的矩形近
似為黃金矩形,由於2/(1+√5)=(√5-1)/2,可以先求出j=[a(√5-1)/2],若a=[
j(1+√5)/2],那麼a = aj,bj = aj + j,若不等於,那麼a = aj+1,bj+1 = aj+1
+ j + 1,若都不是,那麼就不是奇異局勢。然後再按照上述法則進行,一定會遇到奇異
局勢。

#include <stdio.h>
#include <string.h>
#include <math.h>
#include <algorithm>
using namespace std;

int main()
{
    int a,b;
    double k = (sqrt(5)-1.0)/2.0;
    while(~scanf("%d%d",&a,&b))
    {
        if(a>b)
            swap(a,b);
        int j = a*k;
        if(a != (int)(j*(1+k)))
            j++;
        if(a+j == b)
            printf("0\n");
        else
            printf("1\n");

    }

    return 0;
}