算法实训_组合博弈游戏
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Input 本题目包含多组测试,请处理到文件结束(EOF)。每组测试占一行。 每组测试包含两个整数M和N(含义见题目描述,0<N,M<1100) Output 对于每组数据,在一行里按递增的顺序输出小鸡第一次可以加的价。 两个数据之间用空格隔开。如果小鸡在第一次无论如何出价都无法买 到这块土地,就输出"none"。 Sample Input 42 32 35 Sample Output 1 None 345
P状态和N状态:假设双方都采取最明智的策略,则对于一 些状态,刚完成走步的游戏者(Previous Player) 一定胜利, 而对于其他状态,下一个走步的游戏者(NextPlayer) 一定胜 利。把两种状态称为P状态(P position) 和N状态(N position) , 且有以下关系: 1. 所有终止状态是P状态 2. 能一步到达P状态的状态为N状态 3. 每一步都将到达N状态的状态为P状态
所谓巴什博弈,是ACM题中最简单的组合游戏,大致上是 这样的: 只有一堆n个物品,两个人轮流从这堆物品中取物,规定 每次至少取1个,最多取m个,最后取光者得胜。 显然,如果n = m + 1,那么由于一次最多只能取m个,所 以,无论先取者拿走多少个,后取者都能够一次拿走剩余 的物品,后者取胜。因此我们发现了如何取胜的法则: 如果 n = (m + 1) * r + s ,(r为任意自然数,s≤m),即 n%(m+1) != 0,则先取者肯定获胜。
所谓威佐夫博弈,是ACM题中常见的组合游戏中的一种, 大致上是这样的: 有两堆石子,不妨先认为一堆有 10,另一堆有 15 个,双 方轮流取走一些石子,合法的取法有如下两种: 1、在一堆石子中取走任意多颗; 2、在两堆石子中取走相同多的任意颗; 约定取走最后一颗石子的人为赢家,求必胜策略。 两堆石头地位是一样的,我们用余下的石子数(a,b)来表示 状态,并画在平面直角坐标系上。
好运!该死的英语四级! Problem Description 大学英语四级考试就要来临了, Kiki和Cici 在紧张的复习 之余喜欢打牌放松。“升级”?“斗地主”?那多俗啊! 作为计算机学院的学生,Kiki和Cici打牌的时候可没忘记 专业,她们打牌的规则是这样的: 1、 总共n张牌; 2、 双方轮流抓牌; 3、 每人每次抓牌的个数只能是2的幂次(即:1,2,4,8, 16…) 4、 抓完牌,胜负结果也出来了:最后抓完牌的人为胜者; 假设Kiki和Cici都是足够聪明并且每次都是Kiki先抓牌,请 问谁能赢呢?
使用向后归纳的方法,可以计算出游戏的P位置和N位置 如下:
X 状态 0 P 1 N 2 P 3 N 4 N 5 N 6 N 7 P 8 N 9 P 10 N 11 N 12 N
通过观察发现,该游戏中的P位置(必败态)是那些能被 7整除或者模7余2的位置,其他位置都是N位置(必胜 态)。用数学归纳法可以证明这个结论是正确的。 事实上,如果k是P态(自己必败),那么P+1、P+3、P+5 能够到达的位置,是N态(对方必败),其他位置是P态。 游戏的起始位置100是P位置,所以先手输。
„„
„„
* *
„ „ „ „
* ○
* ○
* ○
Leabharlann Baidu
* ○
„
* ○
* ○* ○
„
○ * * ○ * ○ *
„
„
„
○ *
○ * *
○ * ○ *○
„
„
„
„
„
„
„
„
每个局面可以用博弈树的一个结点来表示,某方获胜、失 败或双方平局的结点构成了叶子结点。甲乙双方在选择着 法时,不仅要考虑己方每一种着法的好坏,同时也要考虑 对方会针对自己的每一种着法采取怎样的着法来应对。显 然,博弈树是一种特殊的与或树,“或”结点和“与”结 点是逐层交替出现的。己方扩展的结点之间是“或”关系, 对方扩展的结点之间是“与”关系。
#include <iostream> using namespace std; int main () { int N; while ( cin >> N ) { puts ( N % 3 != 0 ? "Kiki" : "Cici" ); } return 0; }
土地拍卖
Problem Description 小鸡同学和鹏程同学始终没有逃过退学的命运,因为他们没有 在程序设计竞赛中获奖,还为了争抢莎莎大打出手。现在等待 他们的只能回家种田。要种田得有田才行,小鸡听说街上正在 举行一场拍卖会,拍卖的物品正好就是一块田地。于是,小鸡 带上他的全部积蓄,冲往拍卖会。后来发现,整个拍卖会只有 小鸡和他的死对头鹏程。通过打听,小鸡知道这场拍卖的规则 是这样的:刚开始底价为0,两个人轮流开始加价,不过每次加 价的幅度要在1~N之间,当价格大于或等于田地的成本价M时, 就把这块田地卖给这次叫价的人。小鸡和鹏程虽然比赛不行, 但是对拍卖却十分精通,而且他们两个人都十分想得到这块田 地。所以他们每次都是选对自己最有利的方式进行加价。由于 抽签决定,所以每次都是由小鸡先开始加价,请问,第一次加 价的时候,小鸡要出多少才能保证自己买得到这块地呢?
我们也可以把P状态称为必败态,N状态称为必胜态,含义 是直观的。以上关系实际上给出了一个递推计算所有状态 的P-N标号的算法。只要状态集构成一个n个结点m条边的 有向无环图(directed acyclic graph, DAG) ,则可以按照拓扑 顺序在O(m)时间内计算所有状态的标号。可问题在于这样 的状态往往有很多,能否通过数学方法直接判断一个状态 是P状态还是N状态呢? 常见的组合博弈模型,有若干种,但也有很多情况,不能 套用这些模型,要具体情况具体分析。
假设甲乙双方在进行这种二人游戏,从唯一的一个初始局面开始,如 果轮到甲方走棋,甲方有很多种着法,但只能选择一个着法进行走棋。 甲方走棋后,局面发生了变化,轮到乙方走棋,乙方也有很多种着法, 但也只能选择一个着法。从初始局面开始,甲乙两方交替走棋,局面 的变化可以表示成一个树形结构,这就是博弈树(game-tree)。一种 井字棋的博弈树,如图所示。
一个必败点有如下性质: 性质1:所有自然数都会出现在一个必败点中,且仅会出 现在一个必败点中; 性质2:规则允许的任意操作可将必败点移动到必胜点; 性质3:一定存在规则允许的某种操作可将必胜点移动到 必败点;
下面我们证明这3个性质。
其他规则包括:不允许随机走步(不能扔色子或者随机洗 牌),且必须信息完全的(如隐藏走步是不允许的),有 限步结束时不能产生平局。在本节中,我们只考虑公平游 戏,并且通常只考虑普通游戏规则(最后走步的胜)。
和一般的双人零和博弈不同的是,这里的博弈游戏是特殊 的:它们很好的数学特性,使得我们能够找到可判定输赢 的数学策略,而不需要进行状态空间的搜索。
int main() { int n,m; while(scanf("%d%d",&m,&n)!=EOF) { if(m%(n+1)==0) { printf("none\n"); continue; }
if(m<=n) { printf("%d",m); for(int i=m+1; i<=n; i++) printf(" %d",i); printf("\n"); continue; } printf("%d\n",m%(n+1));
湖南涉外经济学院 计算机科学与技术学部 邹竞
组合博弈游戏应满足以下性质: 1. 有两个游戏者。 2. 有一个可能的游戏状态集。这个状态集通常是有限的。 3. 游戏规则指定了在任何状态下双方的可能的走步和对应的后继状态 集。如果在任意状态下双方的走步集合是相同的,那么说游戏是公平 的(impartial) ,否则是不公平的(partizan) 。象棋是不公平的,因为每 个人只能移动自己的子。 4. 两个游戏者轮流走步。 5. 当到达一个没有后继状态的状态后,游戏结束。在普通游戏规则 (normal playrule) 下,最后一个走步的游戏者胜;在misµ ere游戏规则下, 最后一个走步的游戏者输。如果游戏无限进行下去,我们认为双方打 平,但通常我们会附加规定: 6. 不管双方怎么走步,游戏总能在有限步后结束。
巴什博弈还是很好理解的,以你是先手的角度考虑。 你想把对手给弄垮,那么每一局,你都必须构建一个 局势,这个局势就是每次都留给对手m+1的倍数个物 品。因为,如果n=(m+1)r + s,(r为任意自然数,s≤m), 那么先取者要拿走s个物品,如果后取者拿走k(≤m)个, 那么先取者再拿走m+1-k个,结果剩下(m+1)(r-1)个,以 后保持这样的取法,那么先取者肯定获胜。总之,要 保持给对手留下(m+1)的倍数,就能最后获胜。 这个游戏还可以有一种变相的玩法:两个人轮流报数, 每次至少报1个,最多报10个,谁能报到100者胜。
和前面类似,(0,0)肯定是 P 态,又叫必败态。 (0,k),(k,0),(k,k)系列的节点肯定不是 P 态,而是必胜态,你 面对这样的局面一定会胜,只要按照规则取一次就可以了。 再看 y = x 上方未被划去的格点,(1,2)是 P 态。k > 2 时, (1,k)不是 P 态,比如你要是面对(1,3)的局面,你是有可能 赢的。同理,(k,2),(1 + k, 2 + k)也不是 P 态,划去这些点 以及它们的对称点,然后再找出 y = x 上方剩余的点,你 会发现(3,5)是一个 P 态,如此下去,如果我们只找出 a ≤ b 的 P 态,则它们是(0,0),(1,2),(3,5),(4,7),(6,10)……它们 有什么规律吗?
} return 0;
}
巴什博弈有一种变形,叫做减法博弈。用s表示一个正整 数构成的集合,基于S所定义的减法游戏可以描述如下 : 有一个由n个石子组成的石子堆,两名玩家轮流从中拿走 石子,每次拿走石子的个数只能是集合S中的数。拿走最 后一枚石子的玩家获胜。 例:S = {1, 3, 4},如果在游戏的开始有100枚石子,那么哪 个玩家获胜?
忽略(0,0),很快会发现对于第 i 个 P 态的 a,a = i * (sqrt(5) + 1)/2 然后取整;而 b = a + i。居然和黄金分割点扯上了关 系。 前几个必败点如下:(0,0),(1,2),(3,5),(4,7),(6,10), (8,13)……可以发现,对于第k个必败点(m(k),n(k))来说,m(k) 是前面没有出现过的最小自然数,n(k)=m(k)+k。 判断一个点是不是必败点的公式与黄金分割有关(我无法 给出严格的数学证明,谁能给出严格的数学证明记得告诉 我),为: m(k) = k * (1 + sqrt(5))/2 n(k) = m(k) + k
Input 输入数据包含多个测试用例,每个测试用例占一行,包含一个整数n (1<=n<=1000)。 Output 若Kiki能赢的话输出“Kiki”,否则输出“Cici”,每个实例的输出占一 行。 Sample Input 1 3 Sample Output Kiki Cici
如果你是先手,考虑你的必胜态。注意,因为任何正整数都能 写成若干个2的整数次方幂之和。由于规定只能取2的某个整数 次方幂,只要你留给对手的牌数为3的倍数时,那么你就必赢, 因为留下3的倍数时,对手有两种情况: 1:如果轮到对方抓牌时只剩3张牌,对方要么取1张,要么取2 张,剩下的你全取走,win! 2:如果轮到对方抓牌时还剩3*k张牌,对手不管取多少,剩下 的牌数是3*x+1或者3*x+2。轮到你时,你又可以构造一个3的倍 数。 所以无论哪种情况,当你留给对手为3*k的时候,你是必 胜的。 题目说Kiki先抓牌,那么当牌数为3的倍数时,Kiki就输了。否 则Kiki就能利用先手优势将留给对方的牌数变成3的倍数,就必 胜。