HDU3032->SG函数

原创 2016年08月28日 18:27:57

HDU3032->SG函数


题意:

两个人玩游戏,有n堆石子,每堆个数不等,可以进行的操作是从任一堆中取任意颗石子,或者把这堆石子分成两堆。
给出一个初始的局面,判断先手胜还是后手胜。

题解:
sg(n)代表从当前状态到游戏结束最多需要多少步

当有n堆石子时,游戏相当于一个组合博弈,当前的sg值就是每堆石子的sg值异或的结果。

对于任意的一个 Anti-SG 游戏,如果我们规定当局面中所有单一游戏的 SG 值为 0 时游戏 结束,则先手必胜当且仅当以下两个条件满足任意一个:

(1)游戏的 SG 函数不为 0,且游戏中某个单一游戏的 SG 函数大于1。

(2)游戏的 SG 函数为 0,且游戏中没有单一游戏的 SG 函数大于 1。

很明显:sg(0) = 0,sg(1) = 1。

状态2的后继有:0,1和(1,1),他们的SG值分别为0,1,0,所以sg(2) =2。

状态3的后继有:0、1、2、(1,2),他们的SG值分别为0、1、2、3,所以sg(3) = 4。

状态4的后继有:0、1、2、3、(1,3)和(2,2),他们的SG值分别为0,1,2,4,5,0,所以sg(4) = 3.

打表可以发现规律:

if(x%4==0) sg[x]=x-1;
if(x%4==1||x%4==2) sg[x]=x;
if(x%4==3) sg[x] = x+1。

代码:

#include <stdio.h>
#include <iostream>
using namespace std ;
int main()
{
    int T , n , m;
    int res ;
    scanf("%d" , &T) ;
    while(T --)
    {
        scanf("%d" , &n) ;
        res = 0 ;
        while(n --)
        {
            scanf("%d" , &m) ;
            if(m%4 == 0) res^=(m - 1) ;
            if(m%4==1||m%4==2) res^=m ;
            if(m%4==3) res^=(m+1) ;
        }
        if(res == 0) printf("Bob\n") ;
        else printf("Alice\n") ;
    }
    return 0 ;
}
版权声明:本文为博主原创文章,未经博主允许不得转载。

博弈sg函数

sg函数(个人认为还是用于三种方法都无法解决的情况,如按特殊数字取石子) 我们把整个博弈过程抽象为有向无环图 1.      几项准备工作: mex求最小非负整数mex{} = 0,mex{0,1,2...
  • qq_30241305
  • qq_30241305
  • 2016年03月07日 15:36
  • 1167

博弈论 SG函数

别被文章长度吓到,学会博弈(SG)只用看前1/10。 鉴于讲明白博弈要写好多字,于是找了些论文拼凑,对疑难点加了注释并配上“美图”助解。 Nim游戏 重点结论:对于一个Nim游戏的局面(a1,a2,....
  • strangedbly
  • strangedbly
  • 2016年04月12日 21:36
  • 7572

组合游戏 - SG函数和SG定理

组合游戏的和通常是很复杂的,所以我们介绍一种新工具,可以使组合问题变得简单————SG函数和SG定理。 Sprague-Grundy定理(SG定理):         游戏和的SG函数等于各个游戏SG...
  • luomingjun12315
  • luomingjun12315
  • 2015年05月07日 08:09
  • 8140

博弈之SG函数(详解为什么异或可以得出结果)

给定一个有向无环图和一个起始顶点上的一枚棋子,两名选手交替的将这枚棋子沿有向边进行移动,无法移 动者判负。事实上,这个游戏可以认为是所有Impartial Combinatorial Games的...
  • hndu__lz
  • hndu__lz
  • 2017年03月13日 20:40
  • 527

博弈论 SG函数从懵逼到入门 SG模板 hdu1848

 摘自piaocoder的博客: 首先定义mex(minimal excludant)运算,这是施加于一个集合的运算,表示最小的不属于这个集合的非负整数。例如 mex{0,1,2,4...
  • yizhangbiao
  • yizhangbiao
  • 2016年07月22日 10:03
  • 1398

博弈 SG函数

为什么要学习这个呢?因为每次看到题解的第一句话总是这种的: 水题,简单题,模板题,打表题 然后,第二句话,就是结论,比如sg【x】等于(然后一个分类),就得到了公式 最后就是把所有的亦或起来,就得到了...
  • kevin66654
  • kevin66654
  • 2016年08月10日 17:11
  • 392

对于SG函数的理解

首先是NIM游戏,N堆石子,两个人轮流拿,可以拿一堆或者一堆中的一部分。最后谁不能操作...
  • corncsd
  • corncsd
  • 2014年07月06日 18:58
  • 3837

SG函数找规律练习-HDU3032- Nim or not Nim?

问题描述: 两人博弈,N堆石子,可以选择移走某一堆的任意数量的石子,也可以选择将这一堆分成任意两堆东西 解法: 1、SG函数求解 void init() { memset(sg...
  • wxyfennie
  • wxyfennie
  • 2016年08月03日 18:35
  • 570

SG函数的详细解释

SG函数可以说是博弈论中很重要的运用,有了SG函数就可以解决很多很难解决的博弈问题,也是解决例如nim博弈和翻硬币博弈的一些基础。 入门一: 首先来玩个游戏,引用杭电课件上的: ...
  • beyhhhh
  • beyhhhh
  • 2015年07月14日 20:38
  • 550

SG函数模板

首先定义mex(minimal excludant)运算,这是施加于一个集合的运算,表示最小的不属于这个集合的非负整数。例如mex{0,1,2,4}=3、mex{2,3,5}=0、mex{}=0。 对...
  • shankeliupo
  • shankeliupo
  • 2013年10月28日 22:19
  • 1296
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:HDU3032->SG函数
举报原因:
原因补充:

(最多只允许输入30个字)