当前位置: 代码迷 >> 综合 >> POJ-1067 取石子游戏
  详细解决方案

POJ-1067 取石子游戏

热度:77   发布时间:2023-11-23 12:34:15.0

【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;
}
  相关解决方案