四种棋子实质上都是一样的思路:

如果某位置的棋子,它下一步可以走到的位置中 能找到有后手胜的位置,那么该位置先手必胜。

如果某位置的棋子,它下一步可以走到的位置中 全是先手胜,那么该位置后手必胜。

其余三种都用如上思路打表即可,但要注意马的情况(因为马可能有些位置走不到终点):

如果该位置走过去的两个位置都是平局的,那么该位置也是平局。

如果该位置走过去的两个位置都是先手胜,那么该位置后手胜。

如果该位置走过去的两个位置中有至少一个位置是后手胜,那么该位置先手胜。

其余情况,均为平局。

#pragma comment(linker, "/STACK:1024000000,1024000000")
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<vector>
#include<map>
#include<set>
#include<queue>
#include<stack>
#include<iostream>
using namespace std;
typedef long long LL;
const double pi=acos(-1.0),eps=1e-;
void File()
{
freopen("D:\\in.txt","r",stdin);
freopen("D:\\out.txt","w",stdout);
}
inline int read()
{
char c = getchar(); while(!isdigit(c)) c = getchar();
int x = ;
while(isdigit(c)) { x = x * + c - ''; c = getchar(); }
return x;
} const int maxn=;
int king[maxn][maxn],rook[maxn][maxn],knight[maxn][maxn],queen[maxn][maxn];
bool r[maxn],c[maxn],x[*maxn]; int check(int a,int b)
{
if(a<=||a>) return -;
if(b<=||b>) return -;
return knight[a][b];
} void init()
{
memset(king,-,sizeof king);
memset(rook,-,sizeof rook);
memset(knight,-,sizeof knight);
memset(queen,-,sizeof queen); king[][]=;
for(int i=;i<=;i++) king[][i]=king[i][]=king[i-][]^;
for(int i=;i<=;i++) for(int j=;j<=;j++)
if(king[i][j-]==||king[i-][j]==||king[i-][j-]==) king[i][j]=; else king[i][j]=; memset(r,,sizeof r); memset(c,,sizeof c);
rook[][]=; r[]=; c[]=;
for(int i=;i<=;i++) rook[i][]=rook[][i]=;
for(int i=;i<=;i++) for(int j=;j<=;j++)
if(r[i]==||c[j]==) rook[i][j]=; else rook[i][j]=, r[i]=, c[j]=; knight[][]=;
for(int i=;i<=;i++) for(int j=;j<=;j++)
{
if(check(i-,j-)==-&&check(i-,j-)==-) continue;
if(check(i-,j-)==&&check(i-,j-)==) {knight[i][j]=; continue;}
if(check(i-,j-)==||check(i-,j-)==) {knight[i][j]=; continue;}
else continue;
} memset(r,,sizeof r); memset(c,,sizeof c); memset(x,,sizeof x);
queen[][]=; r[]=; c[]=; x[]=;
for(int i=;i<=;i++) queen[i][]=queen[][i]=;
for(int i=;i<=;i++) for(int j=;j<=;j++) {
int num; if(i-min(i-,j-)==) num=j-min(i-,j-); else num=+i-min(i-,j-);
if(r[i]==||c[j]==||x[num]==) queen[i][j]=; else queen[i][j]=, r[i]=, c[j]=, x[num]=;
}
} int main()
{
init(); int T; scanf("%d",&T);
while(T--)
{
int n,m,type,ans; scanf("%d%d%d",&type,&n,&m);
if(type==) ans=king[n][m]; if(type==) ans=rook[n][m];
if(type==) ans=knight[n][m]; if(type==) ans=queen[n][m];
if(ans==) printf("G"); else if(ans==) printf("B"); else printf("D");
printf("\n");
}
return ;
}

HDU 5754 Life Winner Bo的更多相关文章

  1. HDU 5754 Life Winner Bo (博弈)

    Life Winner Bo 题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5754 Description Bo is a "Life W ...

  2. HDU 5754 Life Winner Bo 组合博弈

    Life Winner Bo Problem Description   Bo is a "Life Winner".He likes playing chessboard gam ...

  3. HDU 5754 Life Winner Bo (找规律and博弈)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5754 给你四种棋子,棋子一开始在(1,1)点,两个人B和G轮流按每种棋子的规则挪动棋子,棋子只能往右下 ...

  4. 【博弈论】HDU 5754 Life Winner Bo

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5754 题目大意: 4种棋子,象棋中的 1王,2车,3马,4后,选其一,B和G轮流走,不能往左上走,一 ...

  5. HDU 5754 Life Winner Bo(各类博弈大杂合)

    http://acm.hdu.edu.cn/showproblem.php?pid=5754 题意: 给一个国际象棋的棋盘,起点为(1,1),终点为(n,m),现在每个棋子只能往右下方走,并且有4种不 ...

  6. HDU 5754 Life Winner Bo (各种博弈) 2016杭电多校联合第三场

    题目:传送门 题意:一个国际象棋棋盘,有四种棋子,从(n,m)走到(1,1),走到(1,1)的人赢,先手赢输出B,后手赢输出G,平局输出D. 题解:先把从(n,m)走到(1,1)看做是从(1,1)走到 ...

  7. hdu 5754 Life Winner Bo 博弈论

    对于king:我是套了一个表. 如果起点是P的话,则是后手赢,否则前手赢. 车:也是画图推出来的. 马:也是推出来的,情况如图咯. 对于后:比赛时竟然推错了.QAQ最后看了题解:是个威佐夫博奕.(2, ...

  8. HDU 5754Life Winner Bo

    Life Winner Bo Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others) ...

  9. 5754Life Winner Bo

    给定一个n*m的矩阵,有四种棋子(国际象棋的王,王后,骑士,车).起点在(1,1)先走到(n,m)获胜. 分析:车是nim博弈.王后是威佐夫博弈.王和骑士写两个1000*1000的预处理即可. hdu ...

随机推荐

  1. 向多个会话窗口发送命令 -SecureCRT

    1.前提 一个服务可能部署在多台机器上,这时如果要查问题,最繁复的方法就是打开该服务的每个session,把命令在每一台机器上复制一下执行,找到相关的日志:还有一种方法就是一条命令同时向多个会话窗口发 ...

  2. C#拾遗(二、函数)

    1. 参数数组.C#的特色,允许函数参数的最后指定一个参数数组,可以使用个数不定的参数调用,用params关键字定义 static double SumVals(params double[] val ...

  3. SQLServer中的变量:局部变量,全局变量

    SQLServer中的全局变量   变量 Transact-SQL语言中有两种形式的变量,一种是用户自己定义的局部变量,另外一种是系统提供的全局变量.局部变量 局部变量是一个能够拥有特定数据类型的对象 ...

  4. 大学二三事——那些事(1)

    虽然另外一个队友早上忽然拉肚子没有办法去了,我个阿骚还是决定出发. 本来以为早点过去签到可以躲过李导,没想到在她上班的路上被她撞见.   坐在早上那班发往周至县的客车的时候,天气忽好忽坏.   从周至 ...

  5. Linux之top

    简介 top命令是Linux下常用的性能分析工具,能够实时显示系统中各个进程的资源占用状况,类似于Windows的任务管理器. top显示系统当前的进程和其他状况,是一个动态显示过程,即可以通过用户按 ...

  6. 向量空间(Vector Spaces)

    向量空间(Vector Spaces) 向量空间又称线性空间,是线性代数的中心内容和基本概念之一.在解析几何里引入向量的概念后,是许多问题的处理变得更为简洁和清晰,在此基础上的进一步抽象化,形成了与域 ...

  7. 线段树解决leetcode307. Range Sum Query - Mutable

    在下面的图中,求[0,0]和[1,1]区间元素和, 对于[0,0] start =0 ,end = 0, 查到root = 4 [0-1]的节点,mid = 0, 此时mid > end-1,表 ...

  8. 运算程序,计算玩判断,Y继续,重复计算,N结束

    #include "stdio.h" void main() { /*定义变量,d1,d2:第一.二个数 fu:符号 p1:接收判断号Y/N p2:接收的p1赋给p1 */ int ...

  9. 【.NET】字符串处理

    类名:DealString /// 1.截取字符串,最后加3个小数点 /// 2.获得指定Url的参数的string类型值 /// 3.判断数据类型 /// 4.过滤JS标记 /// 5.获取Chec ...

  10. 【MySQL】查询优化实例解析-延迟关联优化

    [提出问题] 从数据表t通过分页查询的方式读取数据,读取时要根据a1排序.t有80万行记录,当OFFSET很大时,读取速度很慢.优化后查询速度提升很快. 下图是表的定义,一共有几十个字段,RowLen ...