(转)巴氏(bash)威佐夫(Wythoff)尼姆(Nim)博弈之模板
感谢:巴氏(bash)威佐夫(Wythoff)尼姆(Nim)博弈之模板
转自:http://colorfulshark.cn/wordpress/巴氏(bash)威佐夫(wythoff)尼姆(nim)博弈之模板-823.html
最近研究了一下博弈论(听起来很高大上),当然,这只是博弈论中的冰山一角,但不可否认,巴氏(bash)博弈,威佐夫(Wythoff)博弈和尼姆(Nim)博弈这三种在ACM比赛中也是相当重要的,而最大的问题就是,博弈理解起来有较大的难度,即使理解了,也很难快速转换成代码,这对于做题来说是很不利的,于是,我就决定写一套模板,包括多一点接口,从而方便以后的使用,当然,虽然说是自己写的,但也是参考了别人的代码,所以别告我侵权哈。
首先是Bash(巴氏)博弈,这是比较简单的一种,原理就不解释了,相信大家都懂,代码很简短,只需要输入这一堆石子的数目,输赢立刻见分晓
#include<iostream>
using namespace std;
int main(void)
{
int cas,total,price;
scanf("%d",&cas);
while(cas--)
{
scanf("%d%d",&total,&price);
if(total%(price+))
cout<<"先手赢"<<endl;
else
cout<<"先手输"<<endl;
}
return ;
}
接下来上威佐夫(Wythoff)博弈,石子变成两堆,难度也大幅提升,但是
#include<iostream>
#include<cmath>
#include<stdio.h>
using namespace std;
int main ()
{
int a,b,dif;
double p=(sqrt((double))+)/double();
while(cin>>a>>b)
{
dif=abs(a-b);//取差值
a=a<b?a:b;//取较小的值
if(a==(int)(p*dif))//判断是不是奇异局势
printf("0\n");
else printf("1\n");
}
return ;
}
我擦,为毛代码还是这么短
,大神膜拜中。。。(过奖过奖
,如有雷同,请相信这真的只是借鉴)
最后奉上尼姆(Nim)博弈,这种博弈其实就是分解成简单的博弈再一一求解
#include <stdio.h>
#include <string.h>
#include <algorithm>
#include <iostream>
using namespace std;
int a[],ans[][];
int main()
{
int n,i,j,cnt,s;
while(~scanf("%d",&n),n)
{
cnt = ;
s = ;
for(i = ; i<n; i++)
{
scanf("%d",&a[i]);
s^=a[i];
}
for(i = ; i<n; i++)
{
if(a[i] > (s^a[i]))
{
ans[cnt][] = a[i];
ans[cnt][] = s^a[i];
cnt++;
}
}
if(cnt)//判断先手是胜是负
{
printf("Yes\n");
for(i = ; i<cnt; i++)
printf("%d %d\n",ans[i][],ans[i][]);//输出若先手为胜的走法
}
else
printf("No\n");
cout<<cnt<<endl;//输出使先手为胜的方案的数目
}
return ;
}
这个稍微长一点,因为里面增加了很多步骤,大大方便了题目的求解。
从今天开始,你就可以骄(zhuang)傲(bi)的说:“今朝获此三模板,从此博弈是水题!”
(转)巴氏(bash)威佐夫(Wythoff)尼姆(Nim)博弈之模板的更多相关文章
- hdu 2177 威佐夫博弈变形
取(2堆)石子游戏 Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total S ...
- 博弈论基础知识: 巴什博奕+斐波那契博弈+威佐夫博奕+尼姆博弈(及Staircase)(转)
(一)巴什博奕(Bash Game):只有一堆n个物品,两个人轮流从这堆物品中取物,规定每次至少取一个,最多取m个.最后取光者得胜.若(m+1) | n,则先手必败,否则先手必胜.显然,如果n=m+1 ...
- 简单易懂的博弈论讲解(巴什博弈、尼姆博弈、威佐夫博弈、斐波那契博弈、SG定理)
博弈论入门: 巴什博弈: 两个顶尖聪明的人在玩游戏,有一堆$n$个石子,每次每个人能取$[1,m]$个石子,不能拿的人输,请问先手与后手谁必败? 我们分类讨论一下这个问题: 当$n\le m$时,这时 ...
- 博弈---威佐夫博奕(Wythoff Game)
这个写的不错 威佐夫博奕(Wythoff Game):有两堆各若干个物品,两个人轮流从某一堆或同 时从两堆中取同样多的物品,规定每次至少取一个,多者不限,最后取光者得胜. 这种情况下是颇为复杂 ...
- 山东省第八届省赛 A:Return of the Nim(尼姆+威佐夫)
Problem Description Sherlock and Watson are playing the following modified version of Nim game: Ther ...
- HDU 5973 Aninteresting game 威佐夫博奕(Wythoff Game)
HDU 5973:http://acm.hdu.edu.cn/showproblem.php?pid=5975 题意: 有两堆石子,每次可以从一堆石子中取任意个,或者从两堆石子中取相同个数的石子.两个 ...
- NIM游戏,NIM游戏变形,威佐夫博弈以及巴什博奕总结
NIM游戏,NIM游戏变形,威佐夫博弈以及巴什博奕总结 经典NIM游戏: 一共有N堆石子,编号1..n,第i堆中有个a[i]个石子. 每一次操作Alice和Bob可以从任意一堆石子中取出任意数量的石子 ...
- poj 1067 取石子游戏(威佐夫博奕(Wythoff Game))
这里不在详细介绍威佐夫博弈论 简单提一下 要先提出一个名词“奇异局势”,如果你面对奇异局势则必输 奇异局势前几项(0,0).(1,2).(3,5).(4,7).(6,10).(8,13).(9,15) ...
- 【威佐夫博奕】 betty定理 poj 1067
Description 有两堆石子,数量任意,可以不同.游戏开始由两个人轮流取石子.游戏规定,每次有两种不同的取法,一是可以在任意的一堆中取走任意多的石子:二是可以在两堆中同时取走相同数量的石子.最后 ...
随机推荐
- C语言结构体指针成员强制类型转换
#include <stdio.h> #include <stdlib.h> typedef struct ListElmt_ { void *data; struct Lis ...
- 解决cmd 运行python socket怎么终止运行
在cmd里启动python写了一个socket服务端的程序,但是启动之后由于监听连接的是一个死循环 这时想终止运行,发现按ctrl+c,ctrl+z,ctrl+d都不能终止 用ctrl+break解决
- JAVA 扫雷 程序
文件列表 2.主程序入口 3.1部分源代码 package MineSweeper; import java.awt.BorderLayout; import java.awt.Font; impor ...
- java实时监听日志写入kafka(多目录)
目的 实时监听多个目录下的日志文件,如有新文件切换到新文件,并同步写入kafka,同时记录日志文件的行位置,以应对进程异常退出,能从上次的文件位置开始读取(考虑到效率,这里是每100条记一次,可调整) ...
- AD高级规则设置
inpolygon 是所有的覆铜 ispad 是焊盘到焊盘的间距 IsVia 过孔间距 ispad and InComponent('S1') 设置某个器件的焊盘间距规则 ispad and H ...
- android gradle.properties
gradle.properties 里面配置的东西,在gradle 文件里面可以直接引用. 例如: 在你工程根目录的gradle.properties 文件里面 可以这样配置: ## Project- ...
- ThinkPad 触控板双指不可以滑动
我一直在想为什么,今天我想禁用触摸板的时候,我找到原因了. 是因为没有装驱动. http://think.lenovo.com.cn/support/driver/newdriversdownlist ...
- Android自定义组件之简单组合
Android自定义控件有两种,一种是组合.比如一个linearlayout 里面有textview,imageview. 这样的好处是,写一个就可以多处使用. view_image_and_butt ...
- iOS 引用外部静态库(.a文件)时或打包.a时,Category方法无法调用。崩溃
我的这个是MJRefresh,学习打.a包Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: ...
- USACO刷题之路,开始了
几天前,重新开始刷题了. 重新刷题有几个原因: 1.曾经的OI经历,如今除了悟性高些.知识多些,大多已经遗忘.不希望真的让之前的OI水平就这么丢了. 2.越来越觉得,刷题真的是一件很开心的事情.大学中 ...