博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
多校hdu5754(博弈)
阅读量:4312 次
发布时间:2019-06-06

本文共 2238 字,大约阅读时间需要 7 分钟。

©此题中在N×M的棋盘中从(1,1)走到(N,M)B先走G后走,谁先到(N,M)谁赢,走法分为4中分别是国际象棋中的国王,车,马,王后的发,在四种走法下谁能赢;

我们依次分析每一种棋子。

①王。

首先注意一个3*3的棋盘,开始在(1,1),问走到(3,3)谁有必胜策略。

穷举所有情况,容易发现这是后手赢。

对于NN和MM更大的情况,我们把横坐标每隔3、纵坐标每隔3的点都画出来,这些点都是符合后手胜的。 

(因为无论先手怎么移动,后手都能重新移动到这些格子,直到到了终点)

如果初始点不在这些点上,就必然是先手胜。因为先手可以立刻移动到上述的点。

②车。

注意到,如果目前的位置距离终点的xx和yy坐标差相等,一定是后手胜。 

(因为先手只能向下或者向右走一段路;无论他往哪里走,后手往另一维走相同的步数,依然保持这一样一种状态。)

反之,先手必然能走到一处相等的位置,转化为上述问题,所以一定是先手胜。

③马。

  因为只能向右下走所以有两种走法,左1右2,和左2右1;棋盘内有的是可以到达且到达的步数是不变的,分别设走1的k1步,第2种走法的为k2步;可以有方程k1*1+k2*2=m,k1*2+k2*1=n;联立求解,若k1,k2为正整数则能分出胜负;

根据奇偶求胜负。但是还有一点要注意,因为谁都不想输所以要输的人尽量走成平局,这种情况需判断k1与k2间之差大于等于2;大于2就是平局,不难推出。

④皇后。

  仔细观察可发现这是一个威佐夫博弈,可利用n,m之差乘以1.618完美比例与m,n中最小的值进行比较若想等则后手赢。

以下是代码:

#include 
#include
#include
#include
#include
#define LL long long#define d (sqrt(5)+1)/2 //黄金比例using namespace std;int main(){ int t,type,n,m; cin>>t; while(t--) { scanf("%d%d%d",&type,&n,&m); if(m>1000||n>1000||n<2||m<2) continue; n--,m--; if(type==1) { if(n%2==0&&m%2==0) printf("G\n"); else printf("B\n"); } if(type==2) { if(n==m) { printf("G\n"); } else printf("B\n"); } if(type==3) { if((2*n-m)/3*3==2*n-m&&(2*m-n)/3*3==2*m-n) { int k1=(2*n-m)/3; int k2=(2*m-n)/3; int k=k2+k1; if(abs(k1-k2)>1) { printf("D\n"); continue ; } else if(k%2==0) { printf("G\n"); } else printf("B\n"); } else printf("D\n"); } if(type==4) { if((int)(abs(n-m)*d)==min(n,m)) // 注意 (abs(n-m)*d)一定要转换成int型的否则会出错; { printf("G\n"); } else printf("B\n"); } } return 0;}

  

转载于:https://www.cnblogs.com/yuanbo123/p/5710468.html

你可能感兴趣的文章
Spring Boot Docker 实战
查看>>
Div Vertical Menu ver3
查看>>
Git简明操作
查看>>
InnoDB为什么要使用auto_Increment
查看>>
课堂练习之买书打折最便宜
查看>>
定义函数
查看>>
网络虚拟化技术(二): TUN/TAP MACVLAN MACVTAP
查看>>
MQTT协议笔记之mqtt.io项目HTTP协议支持
查看>>
(转)jQuery中append(),prepend()与after(),before()的区别
查看>>
Tecplot: Legend和图像中 Dashed/Dash dot/Long dash 等虚线显示没有区别的问题
查看>>
win8 开发之旅(2) --连连看游戏开发 项目错误的总结
查看>>
一、 object c -基础学习第一天 如何定义一个类
查看>>
Kali Linux的安装
查看>>
我的大学生活-5-08-赵心宁
查看>>
入门阶段
查看>>
Android中使用http协议访问网络
查看>>
Join 与 CountDownLatch 之间的区别
查看>>
vc6下dll调试
查看>>
Ubuntu apt常用命令
查看>>
struts2 配置(部分)
查看>>