1、巴什博弈(Bash Game)
只有一堆n个物品,两个人轮流从这堆物品中取物,规定每次至少取一个,最多取m个。
- 最后取光者胜
若n%(m+1)==0,后手必胜,反之,先手必胜。
- 最后取光着输
当(n-1)%(m+1)==0时 ,后手必胜,否则先手必胜。
Brave Game
十年前读大学的时候,中国每年都要从国外引进一些电影大片,其中有一部电影就叫《勇敢者的游戏》(英文名称:Zathura),一直到现在,我依然对于电影中的部分电脑特技印象深刻。
今天,大家选择上机考试,就是一种勇敢(brave)的选择;这个短学期,我们讲的是博弈(game)专题;所以,大家现在玩的也是“勇敢者的游戏”,这也是我命名这个题目的原因。
当然,除了“勇敢”,我还希望看到“诚信”,无论考试成绩如何,希望看到的都是一个真实的结果,我也相信大家一定能做到的~各位勇敢者要玩的第一个游戏是什么呢?很简单,它是这样定义的: 1、 本游戏是一个二人游戏; 2、 有一堆石子一共有n个; 3、
两人轮流进行; 4、 每走一步可以取走1…m个石子; 5、 最先取光石子的一方为胜;如果游戏的双方使用的都是最优策略,请输出哪个人能赢。
#include<iostream>
using namespace std;
int main()
{
int c;
cin>>c;
while(c--)
{
int n,m;
cin>>n>>m;
if(n%(m+1)==0)cout<<"second"<<endl;
else cout<<"first"<<endl;
}
}
Seek the Joker I
长达数日的春日祭终于告一段落,作为巫女的朝野芳乃在打扫完神社本决定好好享受一下久违的宁静。然而守护了神刀数百年的丛雨难耐寂寞,希望芳乃能陪她一起玩扑克消解愁闷。
芳乃并不擅长市井的游戏,所以总是输多赢少。而昨日被芳乃的神乐舞深深吸引,以致一早就前来建实神社希望能再睹芳华的你碰巧听见了此事。尽管不知道为什么美丽的巫女要自言自语地为玩扑克而苦恼,但你毅然决然地毛遂自荐,希望能为芳乃一解眉间愁。
芳乃告诉了你丛雨准备了n张扑克牌作为牌堆,每人每次至多从牌堆顶部抽k张牌,至少抽1张牌。牌堆底部的最后一张牌作为乌龟,抽中的将输掉这一轮比赛。芳乃想知道在你的帮助下,她和丛雨都采取积极策略时,她自己是否一定能获胜。作为被丛雨邀请的一方,每轮游戏都是芳乃先抽。
因为看不见丛雨而误认芳乃罹患精神分裂的你在不由感叹红颜薄命的同时,决定尽全力帮助芳乃完成她的委托。
声明:本题中的所有角色在剧情发生时均已超过18岁。
输入格式:第一行包含一个整数T,表示共有T组测试数据。
每组测试数据共一行,包含两个正整数n和k,分别表示牌堆中有n张牌和每次抽取最多抽取k张。
数据保证,T,n,k≤106。
输出格式:对于每组测试数据给出一行结果。
如果芳乃必胜,则输出yo xi no forever!,
否则输出ma la se mi no.1!。
输入样例:4 1 1 23 2 6 4 114 514
输出样例:
ma la se mi no.1! yo xi no forever! ma la se mi no.1! yo xi no forever
代码:
#include<bits/stdc++.h>
using namespace std;
int main()
{
int t;
cin>>t;
while(t--)
{
int n,k;
cin>>n>>k;
if(n==1)
{
cout<<"ma la se mi no.1!"<<endl;
}
else if(k==1)
{
if(n%2==1)cout<<"ma la se mi no.1!"<<endl;
else cout<<"yo xi no forever!"<<endl;
}
else if(k>=n)
{
cout<<"yo xi no forever!"<<endl;
}
else //除去前面几个特殊的情况
{
if((n-1)%(k+1)==0)cout<<"ma la se mi no.1!"<<endl;//直接背结论
else cout<<"yo xi no forever!"<<endl;
}
}
}
2、威佐夫博弈
有两堆各若干的物品,两人轮流从其中一堆取至少一件物品,至多不限,或从两堆中同时取相同件物品,规定最后取完者胜利。
若两堆物品的初始值为(x,y),且x<y,则另z=y-x;
记w=(int)[((sqrt(5)+1)/2)*z ];(这个正好是黄金分割率)数学就是这么的奇妙
若w=x,则先手必败,否则先手必胜。
大家就把结论记着就行了,反正我是缕不明白
Seek the Joker II
长达数日的春日祭终于告一段落,作为巫女的朝野芳乃在打扫完神社本决定好好享受一下久违的宁静。然而守护了神刀数百年的丛雨难耐寂寞,希望芳乃能陪她一起玩扑克消解愁闷。
芳乃并不擅长市井的游戏,所以总是输多赢少。而昨日被芳乃的神乐舞深深吸引,以致一早就前来建实神社希望能再睹芳华的你碰巧听见了此事。尽管不知道为什么美丽的巫女要自言自语地为玩扑克而苦恼,但你毅然决然地毛遂自荐,希望能为芳乃一解眉间愁。
芳乃告诉了你丛雨准备了n张扑克牌作为牌堆,自牌顶向下数第x张牌作为乌龟,即“乌龟”的上方有x-1张牌,“乌龟”的下方有n-x张牌,抽中“乌龟”的将输掉这一轮比赛。每人每次可以同时在牌堆顶和牌堆底或者仅在牌堆顶或牌堆底其抽取任意张牌,至少抽1张牌。但若选择同时在牌堆顶和牌堆底抽牌,则抽牌数量需要相同。芳乃想知道在你的帮助下,她和丛雨都采取积极策略时,她自己是否一定能获胜。作为被丛雨邀请的一方,每轮游戏都是芳乃先抽。 因为看不见丛雨而误认芳乃罹患精神分裂的你在不由感叹红颜薄命的同时,决定尽全力帮助芳乃完成她的委托。 声明:本题中的所有角色在剧情发生时均已超过18岁。 **输入格式:** 第一行包含一个整数T,表示共有T组测试数据。 每组测试数据共一行,包含两个正整数n和x,分别表示牌堆中有n张牌和”乌龟“的位置。 数据保证,T≤106 和 n,x≤3∗106。 **输出格式:** 对于每组测试数据给出一行结果。 如果芳乃必胜,则输出yo xi no forever!, 否则输出ma la se mi no.1!。 **输入样例:** 8 1 1 10 3 17 6 12 5 4 3 9 6 12 8 17 11 **输出样例:** ma la se mi no.1! yo xi no forever! yo xi no forever! ma la se mi no.1! ma la se mi no.1! ma la se mi no.1! ma la se mi no.1! ma la se mi no.1!
思路:
题目逼逼了这么多,其实你只要能发现乌龟的上方有牌,下方也有牌,就等于有两堆若干的物品,就是威佐夫博弈。
主要是黄金分割的公式大家记牢。
代码:
#include<bits/stdc++.h>
#define ll long long
using namespace std;
int main(){
double mysticalConstant = (1.0+sqrt(5.0))/2.0;
int T;
cin>>T;
while(T--){
int n,x;
cin>>n>>x;
int a=x-1,b=n-x;
if(a>b) swap(a,b);
int temp = (b-a)*mysticalConstant;
if(temp!=a) cout<<"yo xi no forever!\n";
else
cout<<"ma la se mi no.1!\n";
}
return 0;
}