看了几天博弈论,今天突然豁然开朗,充分理解了SG函数,网上有讲得很好的博弈,三种基本博弈在看完后应该会理解,但是对于理解SG函数,这个链接讲的很

不错,(http://www.cnitblog.com/weiweibbs/articles/42735.html),看第一遍的时候,没人可以看的很明白,所以一定要自己在纸上根据其定义算出几个数的sg值,

例如可选步数集合为{1, 2, 3},算出0到8的sg值,结果如下:

x                0    1    2    3    4    5    6    7    8

g(x)           0    1    2    3    0    1    2    3    0

然后根据计算结果,将上面的那个博客链接里的这段话(首先,所有的terminal position所对应的顶点,也就是没有出边的顶点,其SG值为0,因为它的后继集合是

空集。然后对于一个g(x)=0的顶点x,它的所有后继y都满足g(y)!=0。对于一个g(x)!=0的顶点,必定存在一个后继y满足g(y)=0)挨个字的看,看完这段话就会恍然大悟,知

道sg函数到底是干什么的。然后我想说,上面那个计算的例子其实就是巴什博奕用SG函数来做,他的SG值就是n%(k+1);

理解了SG函数后,对于组合博弈就可以解决了,但一定要记住那句话(游戏的和的SG函数值就是它的所有子游戏的SG函数值的异或),这句话很重要,也是SG的

精髓,知道这个后就可以解决下面两道关于SG函数的题了;

poj 2311 链接  http://acm.hust.edu.cn/vjudge/problem/17242;

题目大意就是说给定一个矩形纸片,然后每个人轮流剪,谁最后剪到1*1就胜利,显然最终状态为(2,2)(2,3)(3,2)时为必输态,所以根据矩形长宽计算其SG值,

然后判断状态就可以了。代码如下:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>using namespace std;int sg[205][205];
int vis[205];int Sg(int n, int m)
{if(sg[n][m] != -1)return sg[n][m];memset(vis, 0, sizeof(vis));for(int i=2; i<=n-i; ++i){vis[(Sg(i, m) ^ Sg(n-i, m))] = 1;}for(int i=2; i<=m-i; ++i){vis[(Sg(n, i) ^ Sg(n, m-i))] = 1;}for(int i=0; i<205; ++i)if(!vis[i]){sg[n][m] = i;return i;}
}
int main()
{int w, h;memset(sg, -1, sizeof(sg));sg[2][2] = sg[2][3] = sg[3][2] = 0;while(scanf("%d%d", &w, &h)!=EOF){if(Sg(w, h))printf("WIN\n");elseprintf("LOSE\n");}return 0;
}

还有一道类似的题目,hdu 5795 链接:

题目大意,两个人玩改进版的尼姆博弈游戏,在原先的基础上,某个人可以将一堆石子分为非空的三堆,然后判断输赢,这道题可以考虑在一堆的情况下的SG值,打表后

会发现规律,打表代码如下:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>using namespace std;int sg[110];
bool vis[1100];int Sg(int x)
{memset(vis, 0, sizeof(vis));for(int i=0; i<x; i++){vis[sg[i]] = true;}int ans;for(int i=1; i<x; i++){for(int j=1; j+i<x; j++){vis[sg[i]^sg[j]^sg[x-i-j]] = true;}}for(int i=0; i<=1000; i++)if(!vis[i])return i;
}
int main()
{memset(sg,-1,sizeof(sg));sg[0] = 0;for(int i=1; i<=100; i++){sg[i] = Sg(i);}for(int i=0; i<=100; i++){printf("sg[%d] = %d\n", i, sg[i]);}return 0;
}

ac代码如下:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>using namespace std;int main()
{int T, n, t;scanf("%d", &T);while(T--){scanf("%d", &n);int sum = 0;for(int i=1; i<=n; ++i){scanf("%d", &t);if(t%8 == 0) t--;else if(t%8 == 7) t++;sum ^= t;}if(sum)printf("First player wins.\n");elseprintf("Second player wins.\n");}return 0;
}

知道SG函数是干什么的相关推荐

  1. Trie树合并 + SG函数 ---- BZOJ4730. Alice和Bob又在玩游戏(动态开点Trie 树上全局异或标记 + 合并 + 博弈论)

    题目大题 题目大意: 解题思路: 首先我们对于子树u的SG函数为SG函数为SG函数为 ⨁是异或和\bigoplus是异或和⨁是异或和 SG[u]=mex{⨁w∈(w的父亲在u到v的路径上)SG[w]∣ ...

  2. 点分治问题 ----------- P3727 曼哈顿计划E[点分治+博弈SG函数打表找规律]

    题目链接 解题思路: 1.首先对于每个操作我们实际上是一个博弈问题 对于k=1的操作就是很基础的NIM游戏就是找到一条链的异或和为0 对于k=2的操作通过达打表找规律: 如果s是奇数那么偶数的SG函数 ...

  3. HTML5圆形线性渐变,css中linear-gradient()函数是干什么的?实现线性渐变的圆形边框(代码)...

    在前端开发过程中,有时会利用linear-gradient实现各种各样的效果,本章给大家介绍css中linear-gradient()函数是干什么的?实现线性渐变的圆形边框(代码).有一定的参考价值, ...

  4. BZOJ 1874: [BeiJing2009 WinterCamp]取石子游戏(SG函数)

    Time Limit: 5 Sec  Memory Limit: 162 MB Submit: 871  Solved: 365 [Submit][Status][Discuss] Descripti ...

  5. 一类SG函数递推性质的深入分析——2018ACM陕西邀请赛H题

    题目描述 定义一种有根二叉树\(T(n)\)如下: (1)\(T(1)\)是一条长度为\(p\)的链: (2)\(T(2)\)是一条长度为\(q\)的链: (3)\(T(i)\)是一棵二叉树,它的左子 ...

  6. hdu1848(sg函数打表)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1848 题意:中文题诶- 思路:直接sg函数打表就好了 代码: 1 #include <iostr ...

  7. AtCoder AGC043C Giant Graph (图论、SG函数、FWT)

    题目链接 https://atcoder.jp/contests/agc043/tasks/agc043_c 题解 场上感觉没啥思路就放弃了,场下想了十几分钟发现是水题,血亏...(只能怪自己计数水平 ...

  8. (转)博弈问题与SG函数

    博弈问题 若你想仔细学习博弈论,我强烈推荐加利福尼亚大学的Thomas S. Ferguson教授精心撰写并免费提供的这份教材,它使我受益太多.(如果你的英文水平不足以阅读它,我只能说,恐怕你还没到需 ...

  9. NIM博弈+SG函数求解

    ICG 给定一个有向无环图和一个起始顶点上的一枚棋子,两名选手交替的将这枚棋子沿有向边进行移动,无法移动者判负. 这个游戏可以认为是所有 Impartial Combinatorial Games 的 ...

  10. SG函数和SG定理(Sprague_Grundy)

    一.必胜点和必败点的概念 P点:必败点,换而言之,就是谁处于此位置,则在双方操作正确的情况下必败.        N点:必胜点,处于此情况下,双方操作均正确的情况下必胜. 必胜点和必败点的性质:    ...

最新文章

  1. SAP PP COR3不能看工单后续的备料TO单号?
  2. 有了Anaconda如何安装Pycharm以及简单使用和调试
  3. MSSQL - 因为数据库正在使用,所以无法获得对数据库的独占访问权。
  4. 使用正确的主机名访问https,提示连接不安全
  5. SQL 分组使用案例
  6. 股市孙子兵法(收藏)
  7. OSPF 邻接关系建立
  8. SQL语句性能优化操作
  9. Sublime Text中文乱码
  10. Silverlight 4版本升级到4.0.60531.0
  11. 千元满血续航王!iQOO Z5发布 售价1799元起
  12. 官宣了!百度36亿美元收购YY直播,一个用户“值”87.4美元
  13. svn .a文件上传不了
  14. Python子类继承父类构造函数说明
  15. daysmatter安卓版_days matter
  16. mysql查询单个员工信息_PHP+MySQL实现模糊查询员工信息功能示例
  17. python暑假培训成都
  18. ipv6被拒的解决方法
  19. A later version of Node.js is already installed. Setup willnow exit.
  20. 清华大学计算机音乐,清华大学2018年毕业歌《告别之前》发布!每个告别都等得到再见...

热门文章

  1. Error:java.lang.RuntimeException: Some file crunching failed, see logs for detail
  2. ubuntu服务器系统进入安全模式,ubuntu bios 无法进入安全模式
  3. [转]用python来开发webgame服务端(5)
  4. gitlab在docker报错could not open /var/opt/gitlab/.ssh/authorized_keys解决
  5. 写一个函数,求一个字符串的长度。
  6. #低码系列#如何设计一个低代码平台?
  7. springboot项目启动参数详解
  8. 基于GetData和ArcGIS的地图数字化教程
  9. sql-in查询-元素超过1000条解决方案
  10. linux android投屏,Github开源Android投屏软件——Scrcpy