1.巴什博弈:一堆石子,每人一次从一堆石子(n个)中拿走1到m个,谁先拿光谁赢。
结论:如果石子数n模(m+1)是0.那么是奇异局势(先手必败),否则先手必胜。
另外:如果先拿光的那个人输的话,那么(n-1)%(m+1)为奇异局势。
2.威佐夫博弈:两堆石子,每人每次从任意一堆中拿任意个或者同时从两堆石子中拿相同个。
结论:ak =[k(1+√5)/2],bk= ak + k (k=0,1,2,...n 方括号表示取整函数)时为奇异局势。
#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;
int main()
{
int a,b;
while(~scanf("%d%d",&a,&b))
{
int t;
if(a > b)
{
t = a;
a = b;
b = t;
}
int d = b - a;
int tmp = floor(d * (1 + sqrt(5.0))/2);
if(tmp == a)
printf("0\n");
else
printf("1\n");
}
return 0;
}
3、nim游戏以及sg定理:有好多堆石子,每个人每次从任意一堆石子中取任意个石子。谁先取完谁赢。
结论:当所有石子的抑或值为0的时候为奇异局势。
一些分析:当石子堆数只有两堆的时候,当两堆数目相等的时候,一个人从一堆里面拿出一些,另一个人就在另一堆里拿出同样数目的棋子。那么先手肯定必败。相反如果两堆棋子数目不一样,那么第一个人先拿走一些使两堆棋子数目一样那么后手必败。
4、sg定理:Sprague-Grundy Theorem: 对于 G=G1+G2+… … Gn
G(X1,X2,… …Xn)=G1(X1) XORG2(X2) …XOR …Gn(Xn)
5、sg函数求解:记忆化搜索。
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cstdio>
using namespace std;
const int MAXN = 10010;
const int maxn = 110;
int n,m,k,t;
int a[maxn],sg[MAXN];
int getsg(int v)
{
if(sg[v] != -1)
return sg[v];
int vis[maxn];
memset(vis,0,sizeof(vis));
for(int i = 0;i < k;i++)
{
int temp = v - a[i];
if(temp < 0)
break;
vis[getsg(temp)] = 1;
}
for(int i = 0;;i++)
{
if(!vis[i])
{
sg[v] = i;
return i;
}
}
}
int main()
{
while(~scanf("%d",&k) && k)
{
for(int i = 0;i < k;i++)
scanf("%d",&a[i]);
sort(a,a+k);
scanf("%d",&m);
memset(sg,-1,sizeof(sg));
for(int u = 0;u < m;u++)
{
scanf("%d",&n);
int ans = 0;
for(int i = 0;i < n;i++)
{
scanf("%d",&t);
ans ^= getsg(t);
}
if(ans == 0)
printf("L");
else
printf("W");
}
printf("\n");
}
return 0;
}
6、奇异状态与非奇异状态:(1)奇异(必败)状态通过任意操作都会转化成非奇异(必胜)状态。
(2)非奇异(必胜)状态通过一定操作可以转化为奇异(必败)状态。
(3)一个非结束状态,如果它能到达任何必败状态,那么它是必胜状态,否则它就 是必败状态。
7、阶梯博弈:博弈在一列阶梯上进行...每个阶梯上放着自然数个点。两个人进行阶梯博弈。每一步则是将一个集体上的若干个点( >=1 )移到前面去。最后没有点可以移动的人输。
结论:如果所有奇数阶梯上的点的数目抑或值等于0那么就是奇异状态,否则为非奇异状态。
思考一下:如果所有奇数台阶上都没有了点,只剩偶数台阶上有点。先手肯定必败。因为如果不止一个台阶上有点, 先手移动第一个偶数级的台阶上的点,后手则跟着他移动后面偶数级台阶上同样的点。而最后。他们都被移到了奇数 的台阶上先手就可以把第一级台阶上的点移到地上后手同样跟着移动,最后肯定先手就没得移动了。
8、斐波那契博弈:有一堆个数为 n 的石子,游戏双方轮流取石子,满足:
1. 先手不能在第一次把所有的石子取完;
2. 之后每次可以取的石子数介于1到对手刚取的石子数的2倍之间(包含1和对手刚取的石子数的2倍)。
约定取走最后一个石子的人为赢家,求必败态。
结论:如果n为斐波那契数则先手必败,否则先手必胜。