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

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

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

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

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

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

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

其余情况,均为平局。

#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. Java中的注释

    代码注释是架起程序设计者与程序阅读者之间的通信桥梁,最大限度的提高团队开发合作效率.也是程序代码可维护性的重要环节之一.所以我们不是为写注释而写注释.下面说一下Javadoc注释规范以及楼主在J2EE ...

  2. 安装PHP

    './configure' '--prefix=/usr/local/php5.6.21' '--with-config-file-path=/usr/local/php5.6.21/etc' '-- ...

  3. ueditor1.4.3 在IE8下的 BUG

    ueditor1.4.3  .net 版 在IE8 下,多图片上传完成后,点击确认时报错,无法插入图片到编辑器中 原因是 ueditor.all.js 中的 24835 行 if (whitList[ ...

  4. studio_svn

    最新升级IDEA12到13版本,升级后发现IDEA中SVN无法正常使用,但文件夹下能够正常使用. 并且报错:svn: E204899: Cannot run program "svn&quo ...

  5. ES6 之 let和const命令 Symbol Promise对象

    ECMAScript 6入门 ECMAScript 6(以下简称ES6)是JavaScript语言的下一代标准,已经在2015年6月正式发布了. (2016年6月,发布了小幅修订的<ECMASc ...

  6. 利用poi向excle写入数据

    import java.io.FileInputStream;import java.io.FileOutputStream;import java.io.IOException;import org ...

  7. srping标签和hibernate查询

    Spring的注解形式:@Repository.@Service.@Controller,它们分别对应存储层Bean,业务层Bean,和展示层Bean. view层:    结合control层,显示 ...

  8. C/C++ 语言中的表达式求值(原文作者:裘宗燕)

    经常可以在一些讨论组里看到下面的提问:“谁知道下面C语句给n赋什么值?”m = 1; n = m+++m++;最近有位不相识的朋友发email给我,问为什么在某个C++系统里,下面表达式打印出两个4, ...

  9. nmon安装(转)

    安装说明安装环境:CentOS-6.3安装方式:源码编译安装软件:nmon_linux_14i.tar.gz下载地址:nmon:http://nmon.sourceforge.net/pm ... n ...

  10. swift 学习线路

    //从(GCD,动画,通知,KVO..) 到闭包 到单子 再到 promise ,再到 reactive //从可选类型 到可选绑定 ,隐私可选解包 ,动态绑定,nil 聚合运算符 再到可选链 再到S ...