储备知识:
贾志豪:《组合游戏略述——浅谈SG游戏的若干拓展及变形》
http://wenku.baidu.com/view/25540742a8956bec0975e3a8.html
王晓珂:《 解析一类组合游戏》
核心策略:归纳,分解,转化 组合游戏
以下题目如阶梯般一步步揭开博弈神秘的面纱~^~,也是对博弈由浅入深的一步步学习之路
从Nim小博弈开始 :尼姆博弈
取石子游戏即著名的 nim 游戏,游戏规则如下: 桌子上有 N 堆石子,游戏者轮流取石子。 每次只能从一堆中取出任意数目的石子,但不能不取。 取走最后一个石子者胜。 这道题每一堆石子的 SG 函数值很显然为该堆石子的数目,根据 SG 函数的特点,最后所有 堆石子的 SG 函数的和 SG=SG1^SG2……SGn 最后,先手胜当且仅当该值不为 0。
1.理解SG函数,熟悉异或xor(^)操作
题目:hdu2176:取(m堆)石子游戏
#include<stdio.h> int a[210000]; int main() { int m,ans; int i; while(scanf("%d",&m)!=EOF&&m) { ans=0; for(i=0;i<m;i++) { scanf("%d",&a[i]); ans^=a[i]; } if(ans) { printf("Yes "); //printf("#%d ",ans); for(i=0;i<m;i++) { int tmp=ans^a[i];//^tmp之后会为0 if(a[i]>=tmp) { printf("%d %d ",a[i],tmp); } } } else printf("No "); } return 0; }
结论:sg[x]==0,当且仅当x为必败状态(SG,与Anti-SG游戏区别)。
2.Anti-SG 游戏和 SJ 定理
[定义](anti-nim 游戏)
桌子上有 N 堆石子,游戏者轮流取石子。
每次只能从一堆中取出任意数目的石子,但不能不取。
取走最后一个石子者败。
[结论]
先手必胜当且仅当:
(1)所有堆的石子数都为 1 且游戏的 SG 值为 0;
(2)有些堆的石子数大于 1 且游戏的 SG 值不为 0。
题目:hdu 1907: John
#include<stdio.h> int main() { int t,n,x,flag,ans; int i,j; scanf("%d",&t); while(t--) { scanf("%d",&n); flag=1; ans=0; for(i=0;i<n;i++) { scanf("%d",&x); ans^=x; if(x>1)flag=0; } if((flag&&!ans)||(ans&&!flag))printf("John "); else printf("Brother "); } return 0; }
一般的Anti-SG游戏:
[定义]
Anti-SG 游戏规定,决策集合为空的游戏者赢。
Anti-SG 其他规则与 SG 游戏相同。
[定理](SJ 定理)
对于任意一个 Anti-SG 游戏,如果我们规定当局面中所有的单一游
戏的 SG 值为 0 时,游戏结束,则先手必胜当且仅当:
(1)游戏的 SG 函数不为 0 且游戏中某个单一游戏的 SG 函数大于 1;
(2)游戏的 SG 函数为 0 且游戏中没有单一游戏的 SG 函数大于 1。
几种组合游戏模型的转化:
1.Cutting Edges游戏(树)
规则如下:
给出一个有 N 个点的树,有一个点作为树的根节点。
游戏者轮流从树中删去边,删去一条边后,不与根节点相连的部分将被移走。
谁无路可走谁输。
我们有如下定理:
叶子节点的 SG 值为 0;中间节点的 SG 值为它的所有子节点的 SG 值加 1 后的异或和。
练习:hdu 3590 PP and QQ 题解
树中加边形成环的情况:
题目大意:
有 N 个局部联通的图。
Harry 和 Sally 轮流从图中删边,删去一条边后,不与根节点相
连的部分将被移走。Sally 为先手。
图是通过从基础树中加一些边得到的。
所有形成的环保证不共用边,且只与基础树有一个公共点。
谁无路可走谁输
解决办法(奇偶去环):
(1) 对于长度为奇数的环,去掉其中任意一个边之后,剩下的
两个链长度同奇偶,抑或之后的 SG 值不可能为奇数,所
以它的 SG 值为 1;
(2) 对于长度为偶数的环,去掉其中任意一个边之后,剩下的
两个链长度异奇偶,抑或之后的 SG 值不可能为 0,所以它
的 SG 值为 0;
练习 POJ 3710 Christmas Game 题解
2.无向图的删边游戏
无向图的删边游戏:
一个无相联通图,有一个点作为图的根。
游戏者轮流从图中删去边, 删去一条边后,不与根节点相连的部
分将被移走。
谁无路可走谁输。
一个著名的定理——Fusion Principle。
[定理]
我们可以对无向图做如下改动:将图中的任意一个偶环缩成一个新
点,任意一个奇环缩成一个新点加一个新边;所有连到原先环上的边全
部改为与新点相连。这样的改动不会影响图的 SG 值。
3.翻硬币游戏
一般的翻硬币游戏的规则是这样的:
N 枚硬币排成一排,有的正面朝上,有的反面朝上。我们从左开
始对硬币按 1 到 N 编号。
游戏者根据某些约束翻硬币(如:每次只能翻一或两枚,或者每
次只能翻连续的几枚),但他所翻动的硬币中,最右边的必须是
从正面翻到反面。
谁不能翻谁输。
这样的结论: 局面的 SG 值为局面中每个正面朝上的棋子单一存在
时的 SG 值的异或和。
$$补充翻硬币游戏约束条件¥¥
4.Every-SG游戏
何为Every-SG游戏???
有N个单一游戏,游戏者轮流进行决策;
游戏者的决策必须满足:
对于所有还没有结束的单一游戏,游戏者必须对该单一游戏进行一步操作;
无路可走者输
贪心策略:
对于某一个单一游戏,如果当前是先手必胜局,
那么先手不会放弃游戏的胜利!!! 那么,
游戏者需要做的,就是让自己可以取得胜利的游戏尽可能长的玩下去,
让自己不能取得胜利的游戏尽可能短的玩下去!!!
解决方法:
对于SG值为0的点,我们需要知道最少几步能将游戏带入终止状态 ;
对于SG值不为0的点,我们需要知道最多几步游戏会被带入终止状态 ;
以上两个值,我们都用step来表示
结论:
先手必胜当且仅当step值最大的单一游戏为先手必胜游戏
思考:
step值最大的既有先手必胜游戏,又有先手必败游戏时,是否意味着平局???