一、
有两堆各若干的物品,两人轮流从其中一堆取至少一件物品,至多不限,或从两堆中同时取相同件物品,规定最后取完者胜利
二、
分析:首先我们根据条件来分析博弈中的奇异局势
第一个(0 , 0),先手输,当游戏另一方面对( 0 , 0)时,他没有办法取了,那么肯定是先手在上一局取完了,那么输。
或者是当游戏另一方面对 (0,k)或 (k,0)时,先手一定输,后手可以把 k 个全部拿走
第二个 ( 1 , 2 ),先手输,先手只有四种取法:
1)取 1 中的一个,那么后手取第二堆中两个。
2)取 2 中一个,那么后手在两堆中各取一个。
3)在 2 中取两个,那么后手在第一堆中取一个。
4)两堆中各取一个,那么后手在第二堆中取一个。
可以看出,不论先手怎么取,后说总是能赢。所以先手必输!
第三个 ( 3 , 5 ),先手必输。
首先先手必定不能把任意一堆取完,如果取完了很明显后手取完另一堆先手必输
假如看取一堆的情况,假设先手先在第一堆中取。
取 1 个,后手第二堆中取4个,变成(1 ,2)了,上面分析了是先手的必输局。
取 2 个,后手第二堆中取3个,也变成( 1 , 2)局面了。
假设先手在第二堆中取:
取 1 个,那么后手在两堆中各取 2 个,也变成 ( 1 , 2 )局面了。
取 2 个 ,那么后手可以两堆中都去三个, 变成 ( 0 , 0)局面,上面分析其必输。
取 3 个,后手两堆各取 1 个 ,变成( 1 , 2)局面了。
取 4 个,后手在第一堆中取一个,变成( 1 , 2)局面了。
可见不论先手怎么取,其必输!
第四个(4 , 7),先手必输。
自己推理可以发现不论第一次先手如何取,那么后手总是会变成前面分析过的先手的必输局面。
那么到底有什么规律没有呢,我们继续往下写。
第四个 ( 6 ,10 )
第五个 ( 8 ,13)
第六个 ( 9 , 15)
第七个 ( 11 ,18)
会发现他们的差值是递增的,为 0 , 1 , 2, 3, 4 , 5 , 6, 7.....n
而用数学方法分析发现局面中第一个值为前面局面中没有出现过的第一个值,比如第三个局面,前面出现了 0 1 2,那么第三个局面的第一个值为 3 ,比如第五个局面,前面出现了 0 1 2 3 4 5 ,那么第五个局面第一个值为6。
再找规律的话我们会发现,第一个值 = 差值 * 1.618
1.618 = (sqrt(5)+ 1) / 2 。
大家都知道0.618是黄金分割比。而威佐夫博弈正好是1.618,这就是博弈的奇妙之处!
CODE:
#include <algorithm>
#include <iostream>
#include <cstring>
#include <cstdlib>
#include <sstream>
#include <cstdio>
#include <vector>
#include <string>
#include <cmath>
#include <stack>
#include <queue>
#include <map>
#include <deque>
#include <set>
#define INF 0x3f3f3f3f
#define memset(a,b) memset(a,b,sizeof(a))
#define mod 1e6+7;
using namespace std;
typedef long long LL;
const double PI = acos(-1);
const int M=1e5+7;
int main()
{
ios::sync_with_stdio(false);
int t;
cin >> t;
LL a,b;
while(t--)
{
cin >> a >> b;
if(a > b)
swap(a,b);
LL temp = b - a;
LL temp1 = floor(temp * ((sqrt(5.0) + 1) / 2.0));
if(temp1 == a)
cout << 'B' << endl;
else
cout << 'A' << endl;
}
}