随笔分类 - 博弈
摘要:/*计算从1-n范围内的SG值。Array(存储可以走的步数,Array[0]表示可以有多少种走法)Array[]需要从小到大排序1.可选步数为1-m的连续整数,直接取模即可,SG(x) = x % (m+1);2.可选步数为任意步,SG(x) = x;3.可选步数为一系列不连续的数,用GetSG(计算)*/int SG[MAX], hash[MAX];void GetSG(int Array[], int n = MAX-1){int i, j;memset(SG, 0, sizeof(SG));for(i = 0; i <= n; i++){memset(hash, 0, sizeo
阅读全文
摘要:转载出处:http://blog.sina.com.cn/s/blog_691ce2b70101ia1d.html/*计算从1-n范围内的SG值。Array(存储可以走的步数,Array[0]表示可以有多少种走法)Array[]需要从小到大排序1.可选步数为1-m的连续整数,直接取模即可,SG(x) = x % (m+1);2.可选步数为任意步,SG(x) = x;3.可选步数为一系列不连续的数,用GetSG(计算)*/int SG[MAX], hash[MAX];void GetSG(int Array[], int n = MAX-1){int i, j;memset(SG, 0, siz
阅读全文
摘要:http://acm.hdu.edu.cn/showproblem.php?pid=2897题意:一堆石子共n个,A、B两人轮流从中取,每次取得石子数必须在[p,q]区间,若剩下的石子数少于p个,则当前取者必须全部取完。最后取完石子的人输。分析:我看分类的时候他写着是用sg打表找规律。我就照做了。我脑残啊。从一堆中取出物体,不就是巴什博弈吗????算法分析:假设先取者为A,后取者为B,初始状态下有石子n个,除最后一次外其他每次取得石子个数必须在[p,q]之间。若当前石子共有n =(p+q)* r个,则A必胜,必胜策略为:A第一次取q个,以后每次若B取K个,A取(p+q-k)个,如此下去最后必剩
阅读全文
摘要:http://acm.hdu.edu.cn/showproblem.php?pid=1517以前做过不过不认真,现在又忘了。出处:http://qianmacao.blog.163.com/blog/static/203397180201223174133470/博弈问题题意:两人玩游戏,从1开始,轮流对数进行累乘,直到超过一个指定的数。算法分析:①、如果输入是2~9,因为Stan是先手,所以Stan必胜。②、如果输入是10~18(9*2),因为Ollie是后手,不管第一次Stan乘的是多少,Stan肯定在2~9之间,如果Stan乘以2,那么Ollie就乘以9,那么Ollie乘以大于1的数都能
阅读全文
摘要:做hdu2176的时候就准备做这题,发现不会。今天看着解题报告,做的。囧。记忆力实在是差。看来还是得遵守记忆曲线。温故而知新。理论:(来自:http://www.wutianqi.com/?p=1081)下面解题报告来自:http://blog.csdn.net/liwen_7/article/details/7937113威佐夫博奕(Wythoff Game):有两堆各若干个物品,两个人轮流从某一堆或同时从两堆中取同样多的物品,规定每次至少取一个,多者不限,最后取光者得胜。 这种情况下是颇为复杂的。我们用(ak,bk)(ak ≤ bk ,k=0,1,2,…,n)表示两堆物品的数量并称其为局.
阅读全文
摘要:http://acm.hdu.edu.cn/showproblem.php?pid=1760题意:出处http://blog.csdn.net/qiqijianglu/article/details/7952261题意:给你一个n*m的矩形,0表示空着的,1反之,现在两个人轮流放2*2的矩形,谁不能放了,谁就输了。找sg值,可以选择暴力,也可以利用sg值的特点简化。暴力就跟取石子一样,没什么差别,DFS搞定。把矩阵看成一个字符串,字符串就是一个状态。其实我们也可以不暴力求sg值,因为只要当前状态能到达一个sg值为0的点,当前状态就是必胜点。若当前点到达的所有状态都是必胜的,那么当前点就是必败点
阅读全文
摘要:http://acm.hdu.edu.cn/showproblem.php?pid=1851简单博弈问题(巴什博弈-Bash Game)巴什博弈:只有一堆n个物品,两个人轮流从这对物品中取物,规定每次至少取一个,最多取m个,最后取光着得胜。很容易想到当n%(m+1)!=0时,先取者必胜,第一次先拿走n%(m+1)个,以后每个回合都保持两人拿走的物品总和为m+1即可。这个游戏还可以有一种变相的玩法:两个人轮流报数,每次至少报一个,最多报10个,谁能报到100者胜。题意:有n堆石头,每堆有mi个石头,每次可从其中的一堆中最少取一个,最多取li个。老师每次都先取,最后取光者为胜。算法分析:此题可以把
阅读全文
摘要:http://acm.hdu.edu.cn/showproblem.php?pid=1730现在我们看单独的一行,也就是说两个人进行棋子的移动,使得任何一方不能走了便是获胜!那么我们换一个方式看棋局的必败态,也就是当两个棋子的相邻的时候,那么先手是必败的。这个时候我们假设两个人都是热衷于取得胜利,并且是要使的两个棋子间的距离减小的走子方式,于是我们通过sg函数的定义,爆出sg函数值就发现sg函数值就是两个棋子的距离的绝对值减1.其实这个还是可以理解的,因为我们看当两个棋子相邻的时候,已经是一个必败态了。因此我们得到了每一棋局的sg函数值。最后对sg函数值进行异或看结果就能知道整个棋局的状态了。
阅读全文
摘要:做过的第一题真正意思上的sg博弈。然后各种不会。http://acm.hdu.edu.cn/showproblem.php?pid=1729转载出处:http://qianmacao.blog.163.com/blog/static/2033971802012343334856/博弈SG函数问题、寻找必败态题目大意:(取石子游戏)有n个箱子,体积为Si,当前箱子里的石子数为Ci。两个人轮流往箱子里放石子,而且每一次放是数量都有限制,不能超过当前箱子内石子数的平方。例如箱子里有3颗石子,那么下一个人就可以放1~9颗石子,直到箱子被装满。当有一方放不下石子时游戏结束,最后放不下石子的人输。算法分析
阅读全文
摘要:转载出处:http://blog.163.com/scuqifuguang@126/blog/static/171370086201101711276278/定义:sg(x) = mex ( sg(y) |y是x的后继结点 )其中mex(x)(x是一个自然是集合)函数是x关于自然数集合的补集中的最小值,比如x={0,1,2,4,6} 则mex(x)=3;什么是后继结点?所谓后继结点就是当前结点经过一个操作可以变成的状态。比如对于娶4石子游戏,假如每次可以取的数目是1,2,4,当前的石子数目也就是当前状态是5,那么5的后继结点就是{5-1, 5-2, 5-4}={4,3,1};如果5的三个后继结
阅读全文
摘要:http://acm.hdu.edu.cn/showproblem.php?pid=1849Nim博弈算法分析:Nim游戏模型:有三堆石子,分别含有a、b、c个石子。两人轮流从某一堆中取任意多的石子,规定每次至少取一个,多者不限。最后取光者得胜。定理1:Nim游戏的一个状态(a、b、c)是P状态,当且仅当a^b^c =0。对应此题就是:共有m个棋子就是m堆石子,把每个位置的标号等价于该堆石子的数目,取走最后一颗石子的人获胜,就是最后一个回到0位置的人获胜。即Nim博弈问题。View Code // I'm lanjiangzhou//C#include <stdio.h>#
阅读全文
摘要:http://acm.hdu.edu.cn/showproblem.php?pid=2516这道题就是简单的博弈,但是分析时候要一点时间。分析: n =2时输出second; n =3时也是输出second; n =4时,第一个人想获胜就必须先拿1个,这时剩余的石子数为3,此时无论第二个人如何取,第一个人都能赢,输出first; n =5时,first不可能获胜,因为他取2时,second直接取掉剩下的3个就会获胜,当他取1时,这样就变成了n为4的情形,所以输出的是second; n =6时,first只要去掉1个,就可以让局势变成n为5的情形,所以输出的是first; n =7时,first
阅读全文
摘要:http://acm.hdu.edu.cn/showproblem.php?pid=2147分析:我看测试数据就觉得n*m是奇数和偶数的时候进行分类就行了。没证明。网上分析:http://www.cnblogs.com/chaosheng/archive/2012/05/29/2524725.htmlP点:就是P个石子的时候,对方拿可以赢(自己输的)N点:就是N个石子的时候,自己拿可以赢现在关于P,N的求解有三个规则(1):最终态都是P(2):按照游戏规则,到达当前态的前态都是N的话,当前态是P(3):按照游戏规则,到达当前态的前态至少有一个P的话,当前态是N题意:在一个m*n的棋盘内,从(1
阅读全文
摘要:http://acm.hdu.edu.cn/showproblem.php?pid=1847分析:测试几组数据就看出来了。我自己测试的时候居然推错 了。嗨。(当然还是看出是巴什博弈)网上分析:找必败点,很容易知道当剩下3时,这是一个必败点,又每一个数减1或减2都可以成为3的倍数,意识到这点大概就会做了,因为假如这个n不是3的倍数,那么我们总可以让它减1或减2变成3的倍数,而作为3的倍数对手是不可能一次就拿完的说,这样一直下去…………………………最终先手者一定有机会把它变成3,或是后手者自杀,故意留给先手者2的k次幂,这样就也是胜利者,所以说3的倍数就是必败点,http://blog.csdn.
阅读全文
摘要:poj 终于突破200大关了,mark一下。hdu也快要300了。加油http://poj.org/problem?id=2234题意:有n堆石子,每人每次可以从一堆中拿走任意多个,两人轮流操作,谁无子可取谁输。输入n堆石子各自的数量,输出先手是否能赢。分析:NP问题,必胜态N(next player wins),必败态P(previous player wins)如果某状态的直接后继中有必败态那么它一定是必胜态,否则为必败态。SG函数。设函数g(x)。我们先把所有的最终局面(最终局面均为必败P局面)g(x)赋值为0。然后所有其他局面g(x)等于其直接后继状态中没有出现过的最小自然数。这样一来
阅读全文
摘要:http://acm.hdu.edu.cn/showproblem.php?pid=1564题意:给定一个N*N的方块 起始点处于一个角上 然后两个人可以轮流将棋子往没有访问过的一个方向移动 不能移动的一方就输了。分析:我直接觉得结果可以通过n的奇偶性来判断。然后就过了。其实这题我是凑巧的。证明在这里:http://blog.csdn.net/topc0o0der/article/details/5928391。还没看懂。View Code //===========================================================================
阅读全文
摘要:题意:给你两个数,每次可以拿大的那个数减去小的那个数的正整数倍,只要减去后得到的数是正的或者0就行,谁先得到其中一个数是0,谁就胜出。我们会发现,假设a>b,如果a/b>=2,那么后面就会出现a/b种路线,当a/b=1的时候只有一种路线,所以谁到了a/b>=2这个局面就有必胜策略,此外,当a%b==0的时候,就直接跳出来了,也是必胜点。View Code // I'm lanjiangzhou//C#include <stdio.h>#include <stdlib.h>#include <string.h>#include <
阅读全文
摘要:http://www.cnblogs.com/exponent/articles/2141477.html(转载)Nim游戏博弈(收集完全版)Nim游戏的概述:还记得这个游戏吗?给出n列珍珠,两人轮流取珍珠,每次在某一列中取至少1颗珍珠,但不能在两列中取。最后拿光珍珠的人输。后来,在一份资料上看到,这种游戏称为“拈(Nim)”。据说,它源自中国,经由被贩卖到美洲的奴工们外传。辛苦的工人们,在工作闲暇之余,用石头玩游戏以排遣寂寞。后来流传到高级人士,则用便士(Pennies),在酒吧柜台上玩。最有名的玩法,是把十二枚便士放成3、4、5三列,拿光铜板的人赢。后来,大家发现,先取的人只要在3那列里取
阅读全文
摘要:http://acm.hdu.edu.cn/showproblem.php?pid=2509题意:从n堆苹果中任意一堆中 取出任意多个连续的个数.最后取光者为输。Fra先下,问是否可以获胜。和上面那题是一样的。具体详细解法看前面那篇文章。View Code // I'm lanjiangzhou//C#include <stdio.h>#include <stdlib.h>#include <string.h>#include <ctype.h>#include <math.h>#include <time.h>/
阅读全文
摘要:http://acm.hdu.edu.cn/showproblem.php?pid=1907这题就相当于取火柴游戏的第二种。题意:最后取到的人为败,每次只能从一堆中取>=1的个数。看了点论文,真不知道这些人是真没想的,无线崇拜。表示:论文还没看懂。按照下面这个做的。我们提出定理里的两个限制:1、SG函数为不为0。2、有没有某单一游戏的SG函数大于1。通过这两个限制,我们可以组合出4种情况:(1)SG==0,有某单一游戏的SG>1。(2)SG!=0,有某单一游戏的SG>1。(必胜SJ)(3)SG==0,无某单一游戏的SG>1。(必胜SJ)(4)SG!=0,无某单一游戏的S
阅读全文

浙公网安备 33010602011771号