HDU 5754 Life Winner Bo
四种棋子实质上都是一样的思路:
如果某位置的棋子,它下一步可以走到的位置中 能找到有后手胜的位置,那么该位置先手必胜。
如果某位置的棋子,它下一步可以走到的位置中 全是先手胜,那么该位置后手必胜。
其余三种都用如上思路打表即可,但要注意马的情况(因为马可能有些位置走不到终点):
如果该位置走过去的两个位置都是平局的,那么该位置也是平局。
如果该位置走过去的两个位置都是先手胜,那么该位置后手胜。
如果该位置走过去的两个位置中有至少一个位置是后手胜,那么该位置先手胜。
其余情况,均为平局。
#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的更多相关文章
- HDU 5754 Life Winner Bo (博弈)
Life Winner Bo 题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5754 Description Bo is a "Life W ...
- HDU 5754 Life Winner Bo 组合博弈
Life Winner Bo Problem Description Bo is a "Life Winner".He likes playing chessboard gam ...
- HDU 5754 Life Winner Bo (找规律and博弈)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5754 给你四种棋子,棋子一开始在(1,1)点,两个人B和G轮流按每种棋子的规则挪动棋子,棋子只能往右下 ...
- 【博弈论】HDU 5754 Life Winner Bo
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5754 题目大意: 4种棋子,象棋中的 1王,2车,3马,4后,选其一,B和G轮流走,不能往左上走,一 ...
- HDU 5754 Life Winner Bo(各类博弈大杂合)
http://acm.hdu.edu.cn/showproblem.php?pid=5754 题意: 给一个国际象棋的棋盘,起点为(1,1),终点为(n,m),现在每个棋子只能往右下方走,并且有4种不 ...
- HDU 5754 Life Winner Bo (各种博弈) 2016杭电多校联合第三场
题目:传送门 题意:一个国际象棋棋盘,有四种棋子,从(n,m)走到(1,1),走到(1,1)的人赢,先手赢输出B,后手赢输出G,平局输出D. 题解:先把从(n,m)走到(1,1)看做是从(1,1)走到 ...
- hdu 5754 Life Winner Bo 博弈论
对于king:我是套了一个表. 如果起点是P的话,则是后手赢,否则前手赢. 车:也是画图推出来的. 马:也是推出来的,情况如图咯. 对于后:比赛时竟然推错了.QAQ最后看了题解:是个威佐夫博奕.(2, ...
- HDU 5754Life Winner Bo
Life Winner Bo Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others) ...
- 5754Life Winner Bo
给定一个n*m的矩阵,有四种棋子(国际象棋的王,王后,骑士,车).起点在(1,1)先走到(n,m)获胜. 分析:车是nim博弈.王后是威佐夫博弈.王和骑士写两个1000*1000的预处理即可. hdu ...
随机推荐
- 向多个会话窗口发送命令 -SecureCRT
1.前提 一个服务可能部署在多台机器上,这时如果要查问题,最繁复的方法就是打开该服务的每个session,把命令在每一台机器上复制一下执行,找到相关的日志:还有一种方法就是一条命令同时向多个会话窗口发 ...
- C#拾遗(二、函数)
1. 参数数组.C#的特色,允许函数参数的最后指定一个参数数组,可以使用个数不定的参数调用,用params关键字定义 static double SumVals(params double[] val ...
- SQLServer中的变量:局部变量,全局变量
SQLServer中的全局变量 变量 Transact-SQL语言中有两种形式的变量,一种是用户自己定义的局部变量,另外一种是系统提供的全局变量.局部变量 局部变量是一个能够拥有特定数据类型的对象 ...
- 大学二三事——那些事(1)
虽然另外一个队友早上忽然拉肚子没有办法去了,我个阿骚还是决定出发. 本来以为早点过去签到可以躲过李导,没想到在她上班的路上被她撞见. 坐在早上那班发往周至县的客车的时候,天气忽好忽坏. 从周至 ...
- Linux之top
简介 top命令是Linux下常用的性能分析工具,能够实时显示系统中各个进程的资源占用状况,类似于Windows的任务管理器. top显示系统当前的进程和其他状况,是一个动态显示过程,即可以通过用户按 ...
- 向量空间(Vector Spaces)
向量空间(Vector Spaces) 向量空间又称线性空间,是线性代数的中心内容和基本概念之一.在解析几何里引入向量的概念后,是许多问题的处理变得更为简洁和清晰,在此基础上的进一步抽象化,形成了与域 ...
- 线段树解决leetcode307. Range Sum Query - Mutable
在下面的图中,求[0,0]和[1,1]区间元素和, 对于[0,0] start =0 ,end = 0, 查到root = 4 [0-1]的节点,mid = 0, 此时mid > end-1,表 ...
- 运算程序,计算玩判断,Y继续,重复计算,N结束
#include "stdio.h" void main() { /*定义变量,d1,d2:第一.二个数 fu:符号 p1:接收判断号Y/N p2:接收的p1赋给p1 */ int ...
- 【.NET】字符串处理
类名:DealString /// 1.截取字符串,最后加3个小数点 /// 2.获得指定Url的参数的string类型值 /// 3.判断数据类型 /// 4.过滤JS标记 /// 5.获取Chec ...
- 【MySQL】查询优化实例解析-延迟关联优化
[提出问题] 从数据表t通过分页查询的方式读取数据,读取时要根据a1排序.t有80万行记录,当OFFSET很大时,读取速度很慢.优化后查询速度提升很快. 下图是表的定义,一共有几十个字段,RowLen ...