取完为胜
P点,必败点
N点,必胜点
① 所有终结点都是必败点P。
② 所有一步能走到必败点P的就是必胜点N。
③ 通过一步操作只能到必胜点N的就是必败点P。
这三条性质很重要,可以解释下面所有问题的解法。本文中解释略过,只给出解法。
1.一堆,每次取若干个
打表,从尾到头。
2.巴什博奕(Bash Game)
一堆,每次取1~m个
打表,从尾到头,同上。
或者,更简单的,n%(m+1)。
3.威佐夫博奕(Wythoff Game)
两堆,一堆取若干,或者两堆取相同
a0=0,b0=0,ak是未在前面出现过的最小自然数,bk=aK+n
ak=[k(1+√5)/2], bk= ak + k (k=0,1,2,...,n 方括号表示取整函数)
4.尼姆博奕(Nimm Game)
多堆,每次从一堆中取若干
异或
5.组合博弈
博弈的精华。sg值,然后异或。以上的问题也可以用sg值来解决。
mex函数,作用于集合,结果为最小的不属于这个集合的非负整数。
g(x) = mex(g(y) | 存在x-->y)
const int maxn = 1000;
int sg[maxn];
memset(sg, -1, sizeof(sg));
int mex(int x){
if(sg[x] != -1)return sg[x];
bool vis[maxn];
memset(vis, 0, sizeof(vis));
for(int i = 0; i < m; ++i){
int now = x - i;
if(now < 0)break;
vis(sg[now] = mex(now)) = true;
}
for(int i = 0; ; ++i){
if(!vis[i]){
return i;
}
}
}