两种常见的取物品游戏:
1.一堆物品
两人轮流取一堆物品,物品数量为n,规定每次至少取一个物品,最多为m个,最后取完者获胜。
思路:如果n=m+1,由于一次最多只能取m个物品,那么无论先取者如何去取,后取的都能获胜。
那么先取者想要获胜的关键就是保证每次取完之后剩余物品的数量都是m+1的倍数,即如果n=r(m+1)+s,先取者要先取走s个,依次保持下去。
2.两堆物品
经典的例子就是POJ ACM 1067题,两个人轮流取石子,每人可以从一堆中取任意数量的石子,或者从两堆中取走相同数量的石子,给定两堆石子的食量,问先取者是否可以获胜。
威佐夫博弈:用(a
k,b
k)表示两堆物品数量,称之为局势,如果甲面对(0,0)局势,那么说明甲已经输了,类似的局势还有
(1,2) (3,5) (4,7) (6,10) (8,13) (9,15) (11,18) (12,20)...
这种局势叫做奇异局势,ak是前面没有出现的最小自然数,bk=ak+k
奇异局势的特点:
1.任何一个自然数都包含在一个且仅有一个奇异局势中。
2.任何操作都可以将奇异局势变为非奇异局势。
3.可以通过适当的方法将非奇异局势变为奇异局势。
所以面对奇异局势的人是不能获胜的。
判断一个局势是不是奇异局势的方法:
ak=[k(1+√5)/2],bk=ak+k ([]是取整运算)
(1+√5)/2=1.6180339887...黄金分割数
于是,取石子游戏的实现如下:
#include<stdio.h>
int main()
{
int n,m,k;
double R=1.6180339887,r=1/R;
scanf("%d%d",&n,&m);//input
//swap if n>m
if(n>m)
{
k=n;
n=m;
m=k;
}
k=n*r;
if(n!=(int)k*R)
++k;
if(m!=(int)k*R+k)
printf("1\n");
else
printf("0\n");
}
分享到:
相关推荐
- **POJ 1067 取石子游戏**、**POJ 1740 A New Stone Game**、**POJ 2234 Matches Game**、**PracticePOJ 1082. Calendar Game**:这些题目涉及了不同类型的博弈问题,如取石子、火柴棒游戏以及日历游戏,需要玩家...
* 1067 取石子游戏:本题目要求使用编程语言来模拟取石子游戏的过程。 * 1740 A New Ston:本题目要求使用编程语言来模拟新石头游戏的过程。 四、算法分类 POJ平台上的题目可以根据代码长度分类,包括短代码、中短...
* 1067 取石子游戏 * 1740 A New Stone Game * 2234 Matches Game * 1082 Calendar Game * 2348 Euclid's Game * 2413 How many Fibs? * 2419 Forests 初等数学 初等数学题目是 POJ 上的一种基础题目,它们通常...
在POJ的其他题目中,如“取石子游戏”(POJ 1067, 1740, 2234等),可能涉及到更复杂的规则,如取石子时必须同时取两堆相同数量的石子,或者不能取已经被取过的数的倍数。这些问题要求玩家不仅考虑当前局面,还要...
题目描述:有 \(n\) 个石子,两人轮流取石子,先手玩家第一次可以取任意多个石子(但不能取完所有石子),之后每次取的石子数不超过上一次的两倍。谁取到最后一个石子谁获胜。 - **解题思路**:此题可通过动态规划...
- 在算法竞赛中,博弈论问题通常涉及玩家之间的策略选择,如取石子游戏。 #### 非主流算法概览 1. **送分题** - 这类题目难度较低,一般用于让参赛者熟悉比赛环境或获得初步的信心。 - 送分题涉及的内容比较...
10. **博弈论**:博弈论问题探讨在策略性互动中的最优决策,如取石子游戏、Calendar Game。这要求选手理解博弈矩阵、最小最大定理、纳什均衡等概念。 11. **日期处理**:这类题目涉及到日历和日期的操作,如Maya ...
在MIPT100 Nim Game中,游戏规则是两玩家轮流从一堆或多堆石子中取走至少一颗石子,直到某一方取完所有石子。通过更深入的分析,可以发现游戏的必败态条件与XOR(异或)运算相关。在必胜状态下,通过XOR运算的结果,...