SG函数:

对于任意状态,定义SG(x)=mex(S),其中S是x的后继状态的SG函数值集合,mex(S)表示不再S内的最小非负整数

SG(X)=0当且仅当x为必败态。

解:

构造一个有向无环图(树),SG(x)=mex(SG(y)) y为x的孩子节点。

SG(所有叶子节点)=0

#include <stdio.h>
#include <algorithm>
#include <string.h>
#include <vector>
using namespace std;
#define MAXN 10005
int n;
int sg[MAXN];
vector <int >map[MAXN];
int vis[MAXN];
void dfs(int y)
{
if (vis[y]) return;
int i,j;
int x;
vector<int> tmp;
for (j=;j<map[y].size();j++)
{
dfs(map[y][j]);
tmp.push_back(sg[map[y][j]]);
}
sort(tmp.begin(),tmp.end());
x=;
int flag=true;
for (i=;i<tmp.size();i++)
if (tmp[i]==x)
x++;
else
{
if (tmp[i]>x)
{
break;
}
}
sg[y]=x;
vis[y]=;
}
int main()
{
int i,j,m,x;
int dot[MAXN];
int cas=;
while (scanf("%d",&n)!=EOF)
{
printf("Case %d:\n",cas++);
for (i=;i<=n;i++)
map[i].clear();
memset(sg,,sizeof(sg));
memset(vis,,sizeof(vis));
for (i=;i<n;i++)
{
scanf("%d",&dot[i]);
for (j=;j<dot[i];j++)
{
scanf("%d",&x);
map[i].push_back(x);
}
}
sg[n]=;
for (i=;i<=n;i++)
if (!vis[i])
dfs(i);
int q;
int p;
scanf("%d",&q);
for (i=;i<q;i++)
{
scanf("%d",&p);
int ans=;
for (j=;j<p;j++)
{
scanf("%d",&x);
ans^=sg[x];
}
if (ans==)
printf("Bob\n");
else
printf("Alice\n");
}
}
return ;
}

ZOJ 3666 博弈 SG函数的更多相关文章

  1. S-Nim HDU 1536 博弈 sg函数

    S-Nim HDU 1536 博弈 sg函数 题意 首先输入K,表示一个集合的大小,之后输入集合,表示对于这对石子只能去这个集合中的元素的个数,之后输入 一个m表示接下来对于这个集合要进行m次询问,之 ...

  2. hdu 3032(博弈sg函数)

    题意:与原来基本的尼姆博弈不同的是,可以将一堆石子分成两堆石子也算一步操作,其它的都是一样的. 分析:由于石子的堆数和每一堆石子的数量都很大,所以肯定不能用搜索去求sg函数,现在我们只能通过找规律的办 ...

  3. HDU-4678 Mine 博弈SG函数

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4678 题意就不说了,太长了... 这个应该算简单博弈吧.先求联通分量,把空白区域边上的数字个数全部求出 ...

  4. (转)博弈 SG函数

    此文为以下博客做的摘要: https://blog.csdn.net/strangedbly/article/details/51137432 ---------------------------- ...

  5. 尼姆博弈+SG函数

    博弈这个东西真的很费脑诶.. 尼姆博奕(Nim Game):游戏者轮流从一堆棋子(或者任何道具)中取走一个或者多个,最后不能再取的就是输家.当指定相应数量时,一堆这样的棋子称作一个尼姆堆 当n堆棋子的 ...

  6. 【转】博弈—SG函数

    转自:http://chensmiles.blog.163.com/blog/static/12146399120104644141326/ http://blog.csdn.net/xiaofeng ...

  7. HDU 1848 Fibonacci again and again (斐波那契博弈SG函数)

    Fibonacci again and again Time Limit: 1000MS   Memory Limit: 32768KB   64bit IO Format: %I64d & ...

  8. Light OJ 1199 - Partitioning Game (博弈sg函数)

    D - Partitioning Game Time Limit:4000MS     Memory Limit:32768KB     64bit IO Format:%lld & %llu ...

  9. LightOJ 1315 - Game of Hyper Knights(博弈sg函数)

    G - Game of Hyper Knights Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%lld & ...

随机推荐

  1. 手写DAO框架(三)-数据库连接

    -------前篇:手写DAO框架(二)-开发前的最后准备--------- 前言 上一篇主要是温习了一下基础知识,然后将整个项目按照模块进行了划分.因为是个人项目,一个人开发,本人采用了自底向上的开 ...

  2. cocos2d 接 android sdk 的一个小坑 关于armbeabi 和 armbeabi-v7a

    cocos2d 接 android sdk 的时候,有些sdk会要求外链到某个工程中,而这个工程的lib文件夹里会包含armbeabi 和 armbeabi-v7a这两个文件夹,如果直接打包会闪退.只 ...

  3. java多线程synchronized volatile解析

    先简单说说原子性:具有原子性的操作被称为原子操作.原子操作在操作完毕之前不会线程调度器中断.即一个操作或者多个操作 要么全部执行并且执行的过程不会被任何因素打断,要么就都不执行.在Java中,对除了l ...

  4. Swift对象创建过程(PUT Object)——纠删码策略(二)

    相应Object使用纠删码(EC)作为存储策略时,BaseObjectController类中PUT和GET需要调用的一些方法会被ECObjectController中相应函数覆盖. 在GET Obj ...

  5. NOIP2010 提高组合集

    NOIP 2010 提高组合集 T1 机器翻译 模拟题,用一个栈模拟,桶记录即可. #include <iostream> #include <cstdio> #include ...

  6. 1154 能量项链 2006年NOIP全国联赛提高组 codevs

    1154 能量项链  2006年NOIP全国联赛提高组 codevs 题目描述 Description 在Mars星球上,每个Mars人都随身佩带着一串能量项链.在项链上有N颗能量珠.能量珠是一颗有头 ...

  7. Ubuntu查看和写入系统日志

    一.背景 Linux将大量事件记录到磁盘上,它们大部分以纯文本形式存储在/var/log目录中.大多数日志条目通过系统日志守护进程syslogd,并被写入系统日志. Ubuntu包括以图形方式或从命令 ...

  8. 2 instances of postgresql but I really need one [closed]

    I happen to have 2 installed instances of postgresql at my machine: 9.1 and 9.2: sudo service postgr ...

  9. C#中类的详解

    类定义的具体语法形式类的访问修饰符 修饰符 类名{ 类的成员} 类的访问修饰符:用于设定对类的访问权限,包括public.internal或者不写,用internal或者不写时代表只能在当前项目中访问 ...

  10. Java读取数据库数据生成柱状图

    此案例是用swing显示数据的.须要引入jfreechart相关包.不同版本号可能包不同样.本人用的是 此案例在ssi框架下会报错,不用框架就没问题. Java后台逻辑代码: public class ...