Ferguson游戏

考虑一个简单的游戏:

有两个盒子,其中一个装有m颗糖、另一个装有n颗糖,将这样的状态记为(m,n)。每次的移动是将其中一个盒子清空,把另一个盒子的一些糖拿到被清空的盒子里使得两个盒子至少各有一颗糖。两个操作者轮流进行操作,不能操作者败。需要判断一个状态是否先手必败。

按照k=m+n从小到大的顺序进行判断即可。

 1 #include <cstdio>
 2 // Ferguson,打印先手必败状态。
 3 const int maxn = 100;
 4 int winning[maxn][maxn]; // 1为先手必胜、0为先手必败
 5 int main(){
 6     winning[1][1] = false; // (1,1)是游戏的唯一终态,此时先手必败
 7     for(int k = 3 ; k < 20 ; k++) // k = n + m
 8         for(int n = 1 ; n < k ; n++){
 9             int m = k - n;
10             winning[n][m] = false;
11             for(int i = 1 ; i < n ; i++) // 如果之后的存在一个状态是先手必败的
12                 if(!winning[i][n - i]) winning[n][m] = true;
13             for(int i = 1 ; i < m ; i++)
14                 if(!winning[i][m - i]) winning[n][m] = true;
15             if(n <= m && !winning[n][m])
16                 printf("%d %d\n",n,m);
17         }
18     return 0;
19 }
时间: 2024-08-29 20:32:49

Ferguson游戏的相关文章

博弈-组合游戏

组合游戏: 规则1:一个状态是必败的状态,当且仅当它的所有后继状态为必胜状态 规则2:一个状态是必胜的状态,当且仅当它的所有后继状态中至少有一个是必败状态 1.Ferguson游戏: 两个盒子有石子n,m.游戏规则为选择其中一个盒子清空,把另一个盒子的石子拿一些给清空的盒子,但需保证至少都有一个..终态为[1,1] 状态: 从后向前推,[n,m]状态能推出的有一个为必败,则[n,m]必胜 [n,m]能推出的全为必胜,则[n,m]必败 #include <iostream> using name

noip复习之数学(4)——组合游戏

我们在此专题中将考虑这样一类组合游戏: (1)两个游戏者轮流操作 (2)游戏的状态集有限,并且不管双方怎么走,都不会再出现以前的状态.这保证了游戏在有限步内结束. (3)谁不能操作谁输,这样的规则避免了平局的出现. 而且我们只考虑公平游戏,即如果一个游戏者可以把状态A变为B,另一个游戏者也可以.国际象棋并不是公平游戏,因为白方可以移动白子,而黑方却不能移动白子. 状态图:为方便描述,我们可以把游戏中的状态画成图.每个节点是一个状态,每条边代表从一个状态转移到另一个状态的操作. 注意:先手必胜状态

2个组合游戏

对于先手而言 必败状态(P position)-->所有后继都是必胜状态 必胜状态(N position)-->有一个后继是必败状态 没有后继的状态是必败状态 1.Ferguson博弈 进行游戏需要用到两个盒子,在游戏的开始,第一个盒子中有n枚石子,第二个盒子中有m个石子(n, m > 0).参与游戏的 两名玩家轮流执行这样的操作:清空一个盒子中的石子,然后从另一个盒子中拿若干石子到被清空的盒子中,使得最后两个 盒子都不空.当两个盒子中都只有一枚石子时,游戏结束.最后成功执行操作的玩家获

20170913自制猜数字游戏

/* 猜数字:系统随机生成一个四位数,请根据下列判断猜出来 A:数值正确,位置正确 B:数值正确,位置不正确 C:数值不正确 */ #include<stdio.h> #include<time.h> #include<stdlib.h> #pragma warning (disable:4996) #define pUCharHead unsigned char * //以数组形式返回n个无重复的随机数,范围可指定[min,max] pUCharHead GenNoR

洛谷P1199 三国游戏

题目描述 小涵很喜欢电脑游戏,这些天他正在玩一个叫做<三国>的游戏. 在游戏中,小涵和计算机各执一方,组建各自的军队进行对战.游戏中共有 N 位武将(N为偶数且不小于 4),任意两个武将之间有一个"默契值",表示若此两位武将作为一对组合作战时,该组合的威力有多大.游戏开始前,所有武将都是自由的(称为自由武将,一旦某个自由武将被选中作为某方军队的一员,那么他就不再是自由武将了),换句话说,所谓的自由武将不属于任何一方. 游戏开始,小涵和计算机要从自由武将中挑选武将组成自己的军

游戏开发 系统app开发游戏定制开发找谁

梦幻珍珠港理财拆分游戏系统软件开发怎么做?找[江生:185-2911-8412 微电]. 梦幻珍珠港拆分游戏平台开发.梦幻珍珠港理财全网模式开发.梦幻珍珠港收益模式介绍开发. 梦幻珍珠港拆分游戏系统源码搭建平台!!我们是软件开发,玩家勿扰!非平台客服,玩家勿扰!] 游戏规则: 一.开发新会员要从您的库房扣除3 03颗珍珠,体系扣除5颗珍珠,新会员有298颗珍珠. 二.推荐老友,推荐人能够得到第一代会员的2%,第二代会员的1%,第三代会员的0.5%,一代的收益就是5.96颗珍珠奖赏(可转换为等量可

游戏服务器开发需要学习的技术

一,游戏服务器编程语言的选择 所谓的游戏服务器编程语言其实有很多,基本上任何一种语言都可以作为游戏服务器的编程语言.这需要根据自己游戏的类型和要求加以选择.比如C++,Java ,Erlang,go等等.目前我用过的只有C++和Java.但是以Java为主.所以接下来就以自己的经验,谈谈以Java为核心的游戏服务器开发技术体系. Java目前作为游戏服务器开发语言已经很是普遍.但是大多数是作为页游或手游的服务器,而端游戏一般选择C++,因为端游对服务器的性能要求相对比较高一些.两种语言各有利弊.

赛码网算法: 格子游戏

格子游戏 题目描述 有n个格子,从左到右放成一排,编号为1-n.共有m次操作,有3种操作类型:1.修改一个格子的权值,2.求连续一段格子权值和,3.求连续一段格子的最大值.对于每个2.3操作输出你所求出的结果. 输入输入第一行两个整数,n表示格子个数,m表示操作次数,n和m中间用空格隔开:接下来输入n行,每行一个整数表示一个格子的权值接下来输入m行,每行有三个整数,中间用空格隔开:第一个是选择的操作类型1-3,第二和第三个整数是操作格子的编号.样例输入3 37892 1 33 1 32 1 2输

【BZOJ4945】[Noi2017]游戏 2-SAT

[BZOJ4945][Noi2017]游戏 题目描述 题解:2-SAT学艺不精啊! 这题一打眼看上去是个3-SAT?哎?3-SAT不是NPC吗?哎?这题x怎么只有8个?暴力走起! 因为x要么不是A要么不是B,所以直接2^8枚举所有x就行了.然后就变成了一个2-SAT问题.假设有两场游戏1,2,分别可以使用的地图为A1,A2,B1,B2,如果有一个限制是1 A 2 A,那么选A1就必须选A2,然后我这个沙茶就开开心心的拿了55分. 为什么不对?我建出来的图显然不对偶啊!考虑逆否命题,选A1就必须选