HDU 5754 Life Winner Bo (各种博弈融合)_博弈式融合是什么-程序员宅基地

技术标签: 博弈  编程题——博弈  hdu  多校题集  

题目链接:HDU 5754


题面:

Life Winner Bo

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others)
Total Submission(s): 827    Accepted Submission(s): 309


Problem Description
Bo is a "Life Winner".He likes playing chessboard games with his girlfriend G.

The size of the chessboard is N×M .The top left corner is numbered (1,1) and the lower right corner is numberd (N,M) .

For each game,Bo and G take turns moving a chesspiece(Bo first).At first,the chesspiece is located at (1,1) .And the winner is the person who first moves the chesspiece to (N,M) .At one point,if the chess can't be moved and it isn't located at (N,M) ,they end in a draw.

In general,the chesspiece can only be moved right or down.Formally,suppose it is located at (x,y) ,it can be moved to the next point (x,y) only if xx and yy .Also it can't be moved to the outside of chessboard.

Besides,There are four kinds of chess(They have movement rules respectively).

1.king.

2.rook(castle).

3.knight.

4.queen.

(The movement rule is as same as the chess.)

For each type of chess,you should find out that who will win the game if they both play in an optimal strategy.

Print the winner's name("B" or "G") or "D" if nobody wins the game.
 

Input
In the first line,there is a number T as a case number.

In the next T lines,there are three numbers type, N and M .

"type" means the kind of the chess.

T1000,2N,M1000,1type4
 

Output
For each question,print the answer.
 

Sample Input
  
  
   
4 1 5 5 2 5 5 3 5 5 4 5 5
 

Sample Output
  
  
   
G G D B
 

Source


题意:

     给定N*M的棋盘,一共4颗棋子,每次一种1颗棋子,从左上角出发,到右下角的人获胜。


解题:

    1.王的走法是向下向右1格,或同时向下向右1格,即(x+1,y)/(x,y+1)/)(x+1,y+1)三种走法,递推推一下即可。一个节点的后继为必败态,那么它为必胜态,如果一个节点的后继全都是必胜态,那么它就是必败态,按剩余步数,从小到大递推一下即可。

     2.车的走法是横向或竖向任意格,那么在对角线上必输,因为先手走什么策略,后手模仿即可,反之n!=m,先手只要使对方到对角线上即必胜。

     3.马的走法和中国象棋是一样的,日字形,马比较特殊的是,会出现平局的情况,即谁都不能到达(n,m),马的递推是,如果后继中有必败态,那么当前节点是必胜态,如果后继中都是必胜态,那么当前节点是必败态,如果后继中有平局,那么当前节点即为平局。(以上推导严格有序,即在排除了前一种情况的前提下成立)。

    4.皇后的走法和王类似,不过王后是走任意步,或者沿斜线任意步。这其实可以看成,两堆石子,要么从一堆取任意个,要么从两堆同时取相同任意个。这就是威佐夫博弈,可见这篇博客

     这题综合考察了几种博弈,还是很不错的,没有接触过博弈的人,可以学到很多。


代码:

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <string>
#include <cstring>
#include <cmath>
#define LL long long
using namespace std;
bool king[1005][1005];
int horse[1005][1005];
bool vis[1005][1005];
int main()
{
	int t,type,n,m,s1,s2;
	memset(king,0,sizeof(king));
	king[0][0]=0;
	for(int i=0;i<=1000;i++)
	{
		for(int j=0;j<=1000;j++)
		{
			if(king[i][j]==0)
			{
				if(i+1<=1000)
				    king[i+1][j]=1;
				if(j+1<=1000)
					king[i][j+1]=1;
                if(i+1<=1000&&j+1<=1000)
					king[i+1][j+1]=1;
			}
		}
	}
    memset(horse,-1,sizeof(horse));
	horse[0][0]=0;
	for(int i=0;i<=1000;i++)
	{
		for(int j=0;j<=1000;j++)
		{
			s1=-2;s2=-2;
		   if(i-1>=0&&j-2>=0)
              s1=horse[i-1][j-2];
		   if(i-2>=0&&j-1>=0)
			  s2=horse[i-2][j-1];
           if(s1!=-2&&s2!=-2)
		   {
			   if(s1==0||s2==0)
				   horse[i][j]=1;
			   else if(s1==-1||s2==-1)
				   horse[i][j]=-1;
			   else
				   horse[i][j]=0;
		   }
		   if(s1!=-2||s2!=-2)
		   {
			   if(s1==0||s2==0)
				   horse[i][j]=1;
			   else if(s1==-1||s2==-1)
				   horse[i][j]=-1;
			   else
				   horse[i][j]=0;
		   }
		  
		}
	}
	scanf("%d",&t);
    while(t--)
	{
		int flag;
		scanf("%d%d%d",&type,&n,&m);
		if(type==1)
		{
			if(king[n-1][m-1]==1)
				flag=1;
			else
				flag=0;
		}
		else if(type==2)
		{
			if(n==m)
				flag=0;
			else
				flag=1;
		}
		else if(type==3)
		{
			n--;
			m--;
			if(horse[n][m]==-1)
				flag=2;
			else if(horse[n][m])
				flag=1;
			else
				flag=0;
		}
		else
		{
			int dif,tmp;
			n--;
			m--;
			if(n>m)
				swap(n,m);
		    dif=m-n;
			tmp=dif*(1.0+sqrt(5.0))/2;
			if(n==tmp)
				flag=0;
			else
				flag=1;
		}
		if(flag==2)
			printf("D\n");
		else if(flag==1)
			printf("B\n");
		else
			printf("G\n");
	}
	return 0;
}



版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/David_Jett/article/details/52043572

智能推荐

分组排序与having筛选-程序员宅基地

文章浏览阅读63次。分组排序与having筛选

五种内存溢出案例总结:涵盖栈深度溢出、永久代内存溢出、本地方法栈溢出、JVM栈内存溢出和堆溢出-程序员宅基地

文章浏览阅读945次,点赞10次,收藏22次。首先,我们创建一个类叫做BlowUpJVM,所有的案例实验都是基于这个类进行。栈深度溢出栈不断递归,而且没有处理,所以虚拟机栈就不断深入不断深入,栈深度就这样溢出了。永久代内存溢出//方法一失败打算把String常量池堆满,没想到失败了,JDK1.7后常量池放到了堆里,也能进行垃圾回收了。然后换种方式,使用cglib,用Class把老年代取堆满try {@Override});虚拟机成功内存溢出了,那JDK动态代理产生的类能不能溢出呢?});

【Linux实操篇一】Vi和Vim编辑器的快捷键练习(必会内容)-程序员宅基地

文章浏览阅读565次,点赞28次,收藏22次。基础篇已经翻页,让我们打开实操的篇章!这一篇主要讲解Vim编辑器的基本使用,也是我们最经常使用的指令。博主正在慢慢更新Linux专栏的学习,如果感觉博主写的还不错的话,可以关注专栏,共同学习哦~~二、基本介绍Linux系统会内置Vi文本编辑器Vim具有程序编辑的能力,可以看做是Vi的增强版本,可以主动的以字体颜色辨别语法的正确性,方便程序设计,在程序员中被广泛使用既然Vim是Vi的增强版,所以文章都以Vim编辑器讲解三、常用模式1、正常模式用Vim打开一个文档就进入了正常模式,这也是默认模式。

笔记本电脑怎么拆开后盖_笔记本电脑拆机、清灰、散热处理流程-程序员宅基地

文章浏览阅读2.5w次,点赞2次,收藏2次。拆机不复杂,备好工具材料、对照步骤就可以上手,关键是把螺丝分类放好。01 材料工具准备电脑型号:华硕A45V笔记本电脑(操作步骤都是相似的,具体拆机方法各类电脑稍有区别)工具材料:“十字”型螺丝刀、硅脂、塑料片、P.S. 螺丝刀建议家中备一套简便的就行(下方链接),硅脂买笔记本电脑用的散热硅脂(微信上没找到链接,拼多多或京东上有,几块钱),塑料片用不用的校园卡、银行卡等等(也可以买..._笔记本后盖怎么拆

Mac系统下Sublime Text内调试JavaScript代码_mac sublime 调试typescript项目-程序员宅基地

文章浏览阅读2.7k次。问题:我想单独调试一段JavaScript代码而不是嵌入到网页端执行 工具: Sublime Text解决问题: 一、安装node.js 当然你也可以使用jsc环境来运行js,这里我们使用node.js来运行, 安装成功查询:在终端中输入 node -v会输出node版本号二、配置编译文件 SublimeText中 Tools -&amp;gt; Build System -&amp;gt; N..._mac sublime 调试typescript项目

使用Docker在windows上安装IBM MQ_win系统中,可视化工具连接其他服务上的ibmmq-程序员宅基地

文章浏览阅读859次,点赞18次,收藏8次。Python编程学习,学习内容包含:语法、正则、文件、 网络、多线程等常用库,推荐《Python核心编程》,不要看完;在实际的渗透测试过程中,面对复杂多变的网络环境,当常用工具不能满足实际需求的时候,往往需要对现有工具进行扩展,或者编写符合我们要求的工具、自动化脚本,这个时候就需要具备一定的编程能力。恭喜你,如果学到这里,你基本可以从事一份网络安全相关的工作,比如渗透测试、Web 渗透、安全服务、安全分析等岗位;③漏洞扫描、漏洞利用、原理,利用方法、工具(MSF)、绕过IDS和反病毒侦察。

随便推点

Android端的短视频开发,我们该如何快速实现移动端短视频功能?_android 实现抖音拍摄视频-程序员宅基地

文章浏览阅读472次。以上就是抖音类APP的部分内容,其中的步骤和过程是我亲自实践过的,按照上述的过程应该都可以正常运行,写这一篇文章花了很多时间,希望所有看了这篇文章的朋友们都能够有一定的收获。此外关于更多音视频的学习资料可以扫描下方二维码免费领取资料!《Android音视频精编源码解析》第一章 WebRTC Native 源码导读●安卓相机采集实现分析●安卓预览实现分析●安卓视频硬编码实现分析●VideoCRE 与内存抖动优化●安卓 P2P 连接过程和 DataChannel 使用。_android 实现抖音拍摄视频

excel poi 的xml配置_Java 使用poi导入excel,结合xml文件进行数据验证的例子(增加了jar包)...-程序员宅基地

文章浏览阅读358次。ava 使用poi导入excel,结合xml文件进行数据验证的例子(增加了jar包)假设现在要做一个通用的导入方法:要求:1.xml的只定义数据库表中的column字段,字段类型,是否非空等条件。2.excel定义成模板,里面只填写了所需要的数据,有可能数据有问题。3.在导入的时候就需要对每个excel单元格的数据进行验证。4.验证完之后,若所有数据正确,那么批量保存。若有一点点错误,就不执行保存..._xml excel column 配置

C++作业 编写一个Shape类并派生出Circle类和Rectangle类,观察运行机制。_按uml图编写程序,实现shape、circle和rectangle类,其中shape是circle-程序员宅基地

文章浏览阅读1.4k次。【问题描述】编写一个Shape类并派生出Circle类和Rectangle类,观察运行机制。shape类有以下成员1)私有成员m_ID2)公有getter和setter3)计算面积函数getArea(),返回0;4)构造与析构函数Circle类从shape类继承,并派生以下成员1)私有成员r2)公有getter和setter3)计算面积函数getArea(),返回计算面积;4)构造与析构函数Rectangle类从shape类继承,并派生以下成员1)私有成员h,w2)公有gette_按uml图编写程序,实现shape、circle和rectangle类,其中shape是circle和rectangle

一杯茶的时间,上手 Node,web前端面试问题及答案-程序员宅基地

文章浏览阅读924次,点赞12次,收藏9次。世界上只有一种真正的英雄主义就是在认清生活真相之后仍然热爱它网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。需要这份系统化的资料的朋友,可以添加V获取:vip1024c (备注前端)一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!慢慢就会领会到它的强大了。下次再见:监听 exit 事件。

【ElasticSearch】分词器(ElasticSearchIK分词器)_elasticsearch 6.7.2 ik分词器-程序员宅基地

文章浏览阅读592次,点赞5次,收藏11次。•IKAnalyzer 是一个开源的,基于java语言开发的轻量级的中文分词工具包•是一个基于Maven构建的项目•具有60万字/秒的高速处理能力•支持用户词典扩展定义。_elasticsearch 6.7.2 ik分词器

24西安电子科技大学833 834考研经验(涵盖各个阶段复习计划)_西电833-程序员宅基地

文章浏览阅读928次,点赞16次,收藏13次。还有兄弟不知道网络安全面试可以提前刷题吗?费时一周整理的160+网络安全面试题,金九银十,做网络安全面试里的显眼包!王岚嵚工程师面试题(附答案),只能帮兄弟们到这儿了!如果你能答对70%,找一个安全工作,问题不大。对于有1-3年工作经验,想要跳槽的朋友来说,也是很好的温习资料!【完整版领取方式在文末!!

推荐文章

热门文章

相关标签