1. 程式人生 > >POJ-1067 取石子游戲

POJ-1067 取石子游戲

題意: 給定兩堆石子, 有兩種取法: 1. 在其中任意一堆中去任意多石子 2. 在兩堆中取相同多石子 最少取一個石子, 不能取為敗。 分析:這道題是一個標準的威佐夫博弈, 對於為一個狀態(a, b)如果他滿足 (a, b)組成的矩形為黃金矩形那麼先手的人就必輸。 組成黃金矩形,那麼他的長寬比應該為(b為長, a為寬)

(a / (b - a)) = (1 + sqrt(5)) / 2

程式碼:

#include <iostream>
#include <cstdio>
#include <cmath>

using namespace std;

//威佐夫博弈
int main () {
    int a, b;
    while (cin >> a >> b) {
        if (a > b) swap(a, b);
        int k = b - a;
        double x = (int)(k*(sqrt(5.0) + 1) / 2.0);
        if (a == x) {
            cout << "0" << "\n";
        } else {
            cout << "1" << "\n";
        }
    }
    return 0;
}