Nim游戏是两个人进行的游戏有如下规则:
1)桌子上有 N 堆石子,游戏者轮流取石子。
2)每次只能从一堆中取出任意数目的石子,但不能不取。
3)取走最后一个石子者胜。
为了求解这一类问题,我们通常要引出SG函数和游戏和的概念
SG函数:对于单一游戏的某一个状态u,sg(u)=mex(sg(v)|从状态u通过游戏的一步到大状态v), 其中,mex(minimal excludant)是定义在整数集合上的操作。它的自变量是任意整数集合,函数值是不属于该集合的最小自然数。 通常来说,当游戏者无法作出行动的时候(无路可走),该状态的sg值为0;sg值为0的状态是必败状态
下面给出SG函数的性质:
(1)对于任意的局面,如果它的 SG 值为 0,那么它的任何一个后继局面的SG 值不为0;
(2)对于任意的局面,如果它的 SG 值不为 0,那么它一定有一个后继局面的 SG值为0。
游戏的和:考虑任意多个同时进行的 SG-组合游戏,这些 SG-组合游戏的和是这样一个 SG-组合游戏,在它进行的过程中,游戏者可以任意挑选其中的一个单一游戏进行决策,最终,没有办法进行决策的人输。
我们引入游戏和的目的是为了把组合游戏转化为单一游戏分别求解SG值,最后只需求出所有单一游戏SG值的异或即可。证明这里就不写了,国家队论文里有三篇可以参考
对于Nim游戏,可以把K堆石子的每一堆看成是一个简单的游戏,分别求出每一堆的SG值,最后求异或即可,显然每一堆的SG值为每一堆中石子的数量。
zoj_3084:
变异的Nim游戏,只能取规定个数的石子,用记忆搜索求每堆的SG值即可,注意visit开的大小
#include<cstdio> #include<string.h> #include<algorithm> using namespace std; int k,m,l,s[101],h[101],sg[10005]; int res[105]; void init() { memset(res,0,sizeof(res)); memset(sg,-1,sizeof(sg)); sg[0]=0; return; } /*void cal_sg(int a) { bool visit[10005]; memset(visit,0,sizeof(visit)); for(int i=0;i<k;++i) { if(a-s[i]>=0) visit[sg[a-s[i]]]=1; } for(int i=0;i<10005;++i) { if(!visit[i]) { sg[a]=i; return; } } }*/ int cal_sg(int a) { if(sg[a]!=-1) return sg[a]; bool visit[80]; memset(visit,0,sizeof(visit)); for(int i=0;i<k;++i) { if(a-s[i]>=0) { cal_sg(a-s[i]); visit[sg[a-s[i]]]=1; } } for(int i=0;i<10005;++i) { if(!visit[i]) { sg[a]=i; break; } } return sg[a]; } int main() { freopen("e:\\zoj\\zoj_3084.txt","r",stdin); while(scanf("%d",&k)&&k!=0) { for(int i=0;i<k;++i) scanf("%d",&s[i]); init(); scanf("%d",&m); for(int i=0;i<m;++i) { scanf("%d",&l); for(int j=0;j<l;++j) { scanf("%d",&h[j]); } for(int j=0;j<l;++j) { res[i]^=cal_sg(h[j]); } /*if(res) printf("W"); else printf("L");*/ } for(int i=0;i<m;++i) { if(res[i]) printf("W"); else printf("L"); } puts(""); } }
ZOJ_2083:
类似Nim,但是变成了线段染色,很巧妙!当一个线段被染成两部分时,分别求出这两部分的SG值再求异或即可
#include<cstdio> #include<string.h> using namespace std; int n,sg[51]; void init() { sg[0]=0; sg[1]=0; } void cal_sg(int k) { int visit[51]; memset(visit,0,sizeof(visit)); for(int i=0;i<=k-2;++i) { visit[sg[i]^sg[k-i-2]]=1; } for(int i=0;i<51;++i) { if(!visit[i]) { sg[k]=i; return; } } } int main() { init(); for(int i=2;i<51;++i) cal_sg(i); freopen("e:\\zoj\\zoj_2083.txt","r",stdin); while(scanf("%d",&n)!=EOF) { int a,res; res=0; for(int i=0;i<n;++i) { scanf("%d",&a); res^=sg[a]; } if(res) puts("Yes"); else puts("No"); } }
发表评论
-
图的割点tarjan---zoj_1119
2011-10-24 23:00 1231http://acm.zju.edu.cn/on ... -
BFS与双向BFS---zoj_1505
2011-10-09 17:14 1640http://acm.zju.edu.c ... -
静态treap+线段树---zoj_2112
2011-09-29 23:06 1707http://acm.zju.edu ... -
多重背包--zoj_2156
2011-09-14 11:10 862首先介绍经典的三种背包问题,0-1背包,完全 ... -
模式串匹配---KMP
2011-08-31 20:49 1276朴素的的模式串匹配算法通常要在向前移动文本指针 ... -
八数码问题(A*&&双向BFS)---zoj_1217
2011-08-30 22:13 1664题目地址:http://acm.zju.edu.cn/onli ... -
ac自动机以及它上面的DFA
2011-08-08 23:04 2478AC自动机(Aho-Corasick)主要用 ... -
二分图最大匹配(匈牙利算法)--zoj1516,1525,2223
2011-07-20 22:36 1185二分图G(E,V)将点集合V分成两个部分L,R ... -
网络最大流(EK)---zoj_1734
2011-07-19 16:34 2129网络最大流是图论中的一个典型问题,为了精确的定 ... -
trie和前缀检查---zoj_2876
2011-07-13 23:03 865trie树是一种多叉树,广泛用于字典检索。如 ... -
位图bitmap
2011-07-13 21:08 913bitmap是一种广泛使用的数据结构,主要用在 ... -
LAC和RMQ的转化---zoj_3195
2011-07-12 22:35 1071我擦。。纠结了好久啊,从SF到TLE,先总结2 ... -
LAC的tarjan(离线)算法---zoj_1141
2011-07-08 17:52 1657LCA就不解释了,这里主要再次复习一下LC ... -
笛卡尔树以及treap---zoj_2243
2011-07-07 15:52 2836zoj_2243笛卡 ... -
线段染色,矩形切割,离散化---zoj_2301,zoj_1128
2011-06-24 22:32 1362染色问题:在一维坐标轴上(最右端为M),有N ... -
线段树---zoj_1610
2011-06-22 21:06 743线段树是一种二叉树的拓展,在线段树每个节点中 ... -
快速排序(qsort)
2011-06-16 17:03 776快速排序是一种高效的非稳定排序,它的基本思路 ... -
斐波那契散列
2011-06-16 16:38 3071斐波那契散列法其实是一种特殊的乘法散列,先来看乘法 ... -
强连通分支(scc)---tarjan
2011-06-15 16:17 1281本文大量 ... -
单源最短路径SPFA---zoj3146
2011-06-09 15:25 939针对Bellman-Ford算法效率比较低 ...
相关推荐
比较全面系统的介绍了公平组合游戏,适合于参加acm竞赛的选手使用
NIM-Duilib-Framework-develop
依码仕喷码机通讯协议9028 NIM A52362-AA-English RS232
Orbits-nim的轨道力学库。_Nim_C_下载.zip
通过计算NiM在MgO上结合能、电子结构以及CO2在NiM/γ-Al2O3上的吸附能发现:NiM和γ-Al2O3之间的作用是电子的,NiM和γ-Al2O3之间电子的转移数以及NiM的d-带中心的变化能表现了NiM和γ-Al2O3之间相互作用的强弱;NiM和...
包括如下文档: Nim和SG函数 方展鹏《浅谈如何解决不平等博弈问题》 组合游戏略述——浅谈SG游戏的若干拓展及变形 算法合集之《由感性认识到理性认识——透析一类搏弈游戏的解答过程》
使用java socket模拟一个在线的聊天室功能,达到小环境的即时通讯。
NIM_iOS_SDK, 网易云信 iOS SDK 发布仓库
CrossPlatform-SDK:云信跨平台SDK发布
Nim is a multi-paradigm language that offers powerful customization options with the ability to compile to everything from C to JavaScript. In Nim in Action you’ll learn how Nim compares to other ...
nim-advent-of-code-2017:Nim中Code 2017的解决方案
nim小游戏 可在dos系统下与计算机玩游戏 让计算机和人较量.在10到100之间生成一个随机数作为初始的石子数目.然后,随机产生0或1,以决定是计算机先玩还是人先玩.然后,再随机产生0或1,以决定计算机采用"聪明"还是"愚蠢...
nim-plotly:nim-lang的绘图库
Nim-SMBExec:Nim中的SMBExec实现-使用NTLM身份验证和Pass-The-Hash技术的SMBv2
nim 3 take 4 give 5 be glad ......
克隆完成后进入NIM_PC_Demo/libs目录,解压cryptlib.zip来释放体积较大的依赖静态库文件,进入NIM_PC_Demo/nim_win_demo目录,使用的Visual Studio 2013更新5以上版本IDE打开nim.sln ,按下F7即可编译项目 ...
nim-amqp:纯Nim中的AMQP 0-9-1库
nim-chronos:Chronos-一个高效的异步编程库
hts-nim-tools:有用的命令行工具,用于展示hts-nim
nim-in-action-code:“行动中的Nim”代码示例