博弈
文章平均质量分 53
NightRaven
cust
展开
-
hdu3389 Game NIM博弈
N个盒子从1--N编号,每个盒子有若干个卡片,每次操作可以选择两个盒子A,B,编号满足 B1 2 7 8 13 14 19...3 6 9 12 15 18...4 5 10 11 16 17....然后两两取出来,把这N个数分成两类,得到1 23 64 57 89 1210 1113 1415 16 17对于每一原创 2014-02-20 18:27:25 · 757 阅读 · 0 评论 -
hdu2999 Stone Game, Why are you always there? 组合NIM
一串石子,每次可以取走若干个连续的石子,取走最后一颗的胜利,给出选取石子数的约束集合,求先手胜负。数据:先给出可取方案的集合,再给去M个K,K表示该串石子的石子数,对于每个K,先手胜利输出1,失败输出2。这题唯一的区别就是取走的石子要有连续,这样每一次取完后,就可以把剩下的省下的看成两串新的取石子游戏,这样就转化成NIM和的问题了。对于每个K求出SG值即可。#include #include原创 2014-02-26 00:33:46 · 744 阅读 · 0 评论 -
hdu2873 Bomb Game 二维SG博弈
n*m的棋盘上有若干炸弹,两人轮流引爆炸弹(1,1位置的不能选取,这个题目好像没说但样例是这个意思= =..)引爆后会在同列的上方,同行的左方各产生一个新的炸弹(若在一个方向已经在边缘,则该方向不产生新的炸弹),没有炸弹可选的一方输,求先手胜负。 考虑一维的情况,等价于多堆取石子的游戏,sg值即石子数,本题中也就是到1,1的距离。 二维时,引爆每个炸弹后会产生两个新的炸弹,而原创 2014-02-25 22:00:37 · 908 阅读 · 0 评论 -
hdu 1907 John,hdu 2509 Be the Winner anti-NIM
基础的NIM博弈,系统学习博弈的话推荐去看:http://blog.csdn.net/acm_cxlove/article/details/7854530 原帖里讲的很清晰。 这题是取到最后一个的为负,所以必胜态为S2,S1,T0,读取的时候求一下亦或并且统计一下富余堆的数量就可以了。#include #include #include #include #inclu原创 2014-02-14 18:29:20 · 685 阅读 · 0 评论 -
hdu3595 GG and MM Every-SG
两堆石子,每次可以将较多的一堆减去较少的一堆数量的整倍数,取走最后一个石子的胜利。现在要同时进行N个相同的游戏,取走最后一颗石子的胜利,求先手胜负。这题和原来的题不一样的一点就是同时进行多个游戏,即每次操作要在所有还没有结束的局面中进行操作,而游戏的胜负是由最后结束的一个游戏的胜负决定的,2009年国家集训队论文 贾志豪:《组合游戏略述——浅谈SG游戏的若干拓展及变形》里对这种游戏进行了讨原创 2014-02-26 15:20:13 · 882 阅读 · 0 评论 -
hdu3980 Paint Chain 组合nim
若干个石子组成一个环,每人每次取走M个连续的石子,先不能取的一方输,求先手胜败..大体思路还是1次操作出现两个子游戏,由两个子游戏的nim和来得到当前游戏的sg值,注意第一次取完以后只是打开了环,没有产生新的一堆,所以第一步要单拿出来处理。#include #include #include #include #include using namespace std;int f[2原创 2014-02-26 23:02:15 · 637 阅读 · 0 评论 -
hdu1536 & 1944 S-NIM 博弈 SG函数
N堆石子,每次可以从选择一堆取走若干个,每次取的数量必须在给定的集合中,取走最后一个的胜利,现在给出操作集合,然后给出N组数据,每组数据有M堆石头,并给出每堆的数量问先手胜负。SG函数网上好多资料就不赘述了,对每一堆求出SG函数值,判断一下异或起来的结果是否为0就ok了。#include #include #include #include using namespace std;t原创 2014-02-14 21:50:49 · 621 阅读 · 0 评论 -
hdu1079 博弈 奇偶规律
给一个日期(年月日),两个人,每人轮流操作,每次可以加一月或者加一天,先到达11月4日的胜利..讨论月+日的奇偶性,因为11.4是一个奇状态,而且无论是月份+1还是日+1都会改变原来状态的奇偶性,所以奇状态一定是一个必胜态,偶状态必败,(跟年份好像没什么关系...)。另外有两个特殊的日期要考虑,9.30和11.30,这两个日期,天数+1的话,还是奇状态,月份+1的话变成偶状态,也就是说只要一个人到原创 2014-02-16 05:54:32 · 785 阅读 · 0 评论 -
hdu1847 SG函数构造
仅有一堆的S-NIM游戏,求出SG(x),0必败,非0必胜。另外这题DP也可以做,根据方案数从小到大递推上去就行了。#include #include #include using namespace std;typedef long long ll;int s[100];int f[2200];int n,m,k;int mex(int p){ int g[100]原创 2014-02-16 06:07:05 · 725 阅读 · 0 评论 -
hdu1525 Euclid's Game 博弈
这题算是个想法题吧,给两个数a,b,两个人轮流行动,每次操作可以把大的数减去小的数的k倍(不能减成负的),先得到0的胜利。假设a>b,令z=a/b,分两种情况讨论,若z==1,那么先手一次必须达到b,a%b,若z>1的话,先收方可按自己想法得到b,a%b或合适把该状态让给对方,而对b,a%b状态递归求解,可以确定该状态的胜负情况,所以a/b>2的时候,先手必胜,否则就辗转相减,以a==b || a原创 2014-02-16 06:03:31 · 545 阅读 · 0 评论 -
hdu1846 Brave Game 标准巴什博奕
巴什博奕的原型..m+1必败,否则先手必胜。#include #include #include using namespace std;int dp[2000];int n,m,x,y;int main(){// freopen("in.txt","r",stdin); int tt; cin>>tt; while(tt--) {原创 2014-02-16 06:09:01 · 591 阅读 · 0 评论 -
hdu2897 邂逅明下 巴什博弈
看到题直接去打SG表,果断T掉了=..发现这题一共有10W组数据...细想想容易发现,对于区间[L,R],[1,L]lost,[L+1,L+R]win [L+R+1,L*2+R]lost ,[2*L+R+1,2*L+2*R]win..胜负状态是以l+r为循环节循环的,那么n%=(l+r)就可以直接判断了...#include #include #include #include usi原创 2014-02-20 04:28:05 · 693 阅读 · 0 评论 -
hdu3032 Nim or not Nim? SG打表找规律
N堆石子,每次两种操作,1:选取一堆,取走若干个;2:选取一堆,将其分成两堆石子。取走最后一个石子的输。 数据给的很大,一组一组的去求SG函数显然会超=..算一下较小的SG值,发现0--8的SG值分别为0,1,2,4,3,5,6,8,7....发现还是有规律的,那么直接按规律算出SG值最后异或一下答案就出来了..#include #include #include usin原创 2014-02-20 04:54:51 · 745 阅读 · 0 评论 -
hdu2516 取石子游戏 fib博弈
又是一种特殊的模型..对于n,斐波那契数列为必败态,否则必胜..证明参见:http://www.xuebuyuan.com/1273671.html#include #include #include #include using namespace std;typedef long long ll;const ll inf=1LL<<31LL;ll n,m;int main(原创 2014-02-20 03:43:29 · 612 阅读 · 0 评论 -
hdu1760 A New Tetris Game 博弈,Dfs
N*M的棋盘,0表示可用1表示不可用,两人轮流向棋盘中放置2*2的棋子,棋子与棋子不能重叠,同样不能覆盖不可用区域,先不能放棋子的输,求先手胜负。棋盘最大也就50*50,直接从初始状态Dfs,边界条件棋盘不能放置棋子为必败态,对于每个状态若子状态中有一个为必败态则直接返回true,所有的子状态都为true的时候则返回false。#include #include #include #原创 2014-02-24 22:25:30 · 688 阅读 · 0 评论 -
hdu1404 Digital Deletions SG打表
一个由'0'--'9'组成的字符串,两人轮流操作,每次操作可以选择一位,把这一位变成任意一个小于他的数,或者选取一个0,把这一位开始,右边的字符全部删除,最后把字符串删空的一方胜利。从0开始dp所有的状态,若是一个必败态,则它可转移到的状态全部必胜。要注意的一点是读取数据的时候,如果有前导0,那么先手可以直接获胜。思路挺简单,但状态转移的时候还是要考虑一些细节的问题..#include #i原创 2014-02-24 18:20:38 · 757 阅读 · 0 评论 -
hdu3537 Daizhenyang's Coin 翻硬币,(Mock Turtles游戏)
博弈模型,翻硬币游戏的模型可以参考:http://blog.csdn.net/acm_cxlove/article/details/7854534这一题的约束条件是可以选取1,2,3枚硬币翻转,对应文章中约束条件六(Mock Turtles游戏):每次可以翻动一个、二个或三个硬币。(Mock Turtles游戏)初始编号从0开始。当N==1时,硬币为:正,先手必原创 2014-02-20 22:05:04 · 1127 阅读 · 1 评论 -
hdu3951 Coin Game
N枚硬币摆成一个环,每次可以取走连续的1--K枚硬币,取走最后一枚的胜利,求胜负.. K>=N时先手直接取完,K==1的时候讨论奇偶性,剩下的情况先手取完后必然产生一条链,那么后手则可以取走1或2枚硬币使得省下的硬币变成数量相同的两堆,那么就是后手必胜了..#include #include #include #include #include using namespac原创 2014-02-20 23:07:51 · 627 阅读 · 0 评论 -
hdu1850 Being a Good Boy in Spring Festival nim博弈
N堆牌,没堆Ai张,问先手必胜的前提下,第一次有多少种可行的取法。 每堆牌异或一下得到ans,如果是先取第i堆的话,其他堆异或的结果为B,那么(Ai-x) xor B==0时,说明从Ai中取走x可以留给对手一个必败态,所以对每一堆求出x后,判断一下x是否小于Ai,若小于则答案++。#include #include #include #include #include usi原创 2014-02-23 01:26:50 · 618 阅读 · 0 评论 -
hdu2176 取(m堆)石子游戏 nim博弈
还是nim博弈求先手方案的问题,N堆石子,每次可以选择一堆取走若干个,问先手有多少中取法可以必胜。必胜的话,输出所有方案,即若存在一堆数量为a的石子,取完后还剩下b个可以必胜就输出a b。先取第i堆的话,其他堆异或的结果为B,那么(Ai-x) xor B==0时,说明从Ai中取走x可以留给对手一个必败态,所以对每一堆求出x后,判断一下x是否小于Ai,若小于则答案++,记录下来取法。#inclu原创 2014-02-23 01:35:33 · 725 阅读 · 0 评论 -
hdu1527,poj1067 取石子游戏 威佐夫博奕(Wythoff Game)
两堆石子,每次可以从一堆取走任意个,或者两堆同时取走任意个,求先手胜负。标准威佐夫博奕(Wythoff Game)模型,下面搬运模型证明过程..原帖:http://blog.csdn.net/acm_cxlove/article/details/7854530威佐夫博奕(Wythoff Game):有两堆各若干个物品,两个人轮流从某一堆或同时从两堆中取同样多的物品,规定每次原创 2014-02-23 02:00:00 · 710 阅读 · 0 评论 -
hdu2177 取(2堆)石子游戏 威佐夫博奕
还是威佐夫博奕的模型,这题需要输出第一步的方案。先把所有的奇异局势打个表存起来,然后没读一组数据在表中搜一下,100W内的奇异局势大概有60W+种,数据组数不多的话还是没什么问题的...#include #include #include #include using namespace std;typedef long long ll;const double gold=1.61原创 2014-02-23 02:33:25 · 810 阅读 · 0 评论 -
hdu2486 A simple stone game K倍动态减法游戏
巨坑的一道博弈...思路太奇葩了...理解能力强的推荐去看2009年国家集训队论文 曹钦翔《从“k倍动态减法游戏”出发探究一类组合游戏问题》里面给有详细的证明过程...先说一下题意,N个石子,第一次可以去1---N-1中任意数量的,之后每次最少取1个,最多取k*上次去的石子数,取走最后一颗的胜利,网上题解也不少,我是感觉都不怎么好懂, 我做的时候参考了这里的文章:http://blog.cs原创 2014-02-24 02:35:30 · 964 阅读 · 1 评论 -
hdu4315 Climbing the Hill 转化NIM模型
一列格子,最上层是0,依次向下编号,有若干个棋子在不同的格子中,其中距离0第k近的是特殊子,两个人每人可以选择一个棋子向上移动任意的位置,但是不能和其他棋子重合或越过别的棋子,某个棋子被移动到0的时候,棋子消失,把特殊子移动到0的一方胜利。 首先确定一个前提,如果有偶数个棋子并且k>1,那么两两棋子相邻的状态为必败态,因为先手不管怎么移动,后手都可以把状态变成所有棋子两两相邻,直到原创 2014-02-24 03:06:41 · 768 阅读 · 0 评论 -
hdu3404 Switch lights 求NIM积
N*M的方格,每个位置有一枚朝上或朝下的硬币,两人轮流操作,每次操作可以选择矩形的四个顶点,把四个点位置的硬币翻转,要求右下角位置的硬币必须是从正到反,求先手胜负。2009年国家集训队论文 曹钦翔《从“k倍动态减法游戏”出发探究一类组合游戏问题》里的例题,里面提出了NIM积并给出了求NIM积的方法,具体讲解参见论文,实在看不懂的就先把结论给记下来吧....#include #include原创 2014-02-24 16:19:49 · 787 阅读 · 0 评论 -
hdu Stone Game SG函数
N个箱子,每个箱子有一个size表示最多装的石子数,一个c表示当前已经装了c个石子。现在两个人轮流操作,每次操作可以选择一个箱子放置1--k个石子,其中k是箱子中当前拥有的石子数的平方,最先无法操作的一方输,求先手胜负。乍一看好像是一个动态的博弈,其实没有想得那么复杂..对于第i个箱子,有Si,Ci,那么我们可以求出一个最大Ti满足Ti*Ti+TiCi>Ti,当前箱子先手有必胜方案,sg值原创 2014-02-24 21:13:26 · 709 阅读 · 0 评论 -
hdu1730 Northcott Game SG函数
n*m的棋盘,每一行有一个黑子一个白子,每次可以选择我方棋子,在不跨越对方棋子的前提下移动到任何位置,最先不能移动的一方输。求先手胜败。可以想到,每行棋子两两相邻的状态是一个必败态,因为先手无论怎么动,后手都可以继续贴住对方的棋子,直到先手无路可走,那么就可以以每行黑白子之间的距离作为sg值。#include #include #include #include using nam原创 2014-02-24 21:31:16 · 799 阅读 · 0 评论 -
hdu 1848 Fibonacci again and again SG打表
三堆石子,两人轮流取,每次选一堆,取走任意斐波纳契数量的石子,取完最后一个石子的胜利,求先手胜负。取子的方案都给了,直接打表求sg吧。#include #include #include #include #include using namespace std;typedef long long ll;int n,m;int sg[10100];int fib[1010原创 2014-02-24 22:44:41 · 665 阅读 · 0 评论 -
hdu1851 A Simple Game
还是取石子游戏,N堆石子,第i堆有DI个石子,每次可以取走1--LI个石子,取走最后一个的胜利,问后手胜负。数据很小,怎么搞都可以了,对每堆石子按照上限L求一下SG就可以,按巴士博弈去做也行。#include #include #include #include using namespace std;typedef long long ll;int n,m;int f[30原创 2014-02-24 23:13:20 · 572 阅读 · 0 评论 -
zoj3529 A Game Between Alice and Bob 博弈
N个数字,两人轮流操作,每次操作ke原创 2014-05-09 11:08:00 · 598 阅读 · 0 评论