HDU 5754 Life Winner Bo 组合博弈
Life Winner Bo
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 x′≥x and y′≥y.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.
In the next T lines,there are three numbers type,N and M.
"type" means the kind of the chess.
T≤1000,2≤N,M≤1000,1≤type≤4
1 5 5
2 5 5
3 5 5
4 5 5
G
D
B
题意:
4种棋。
棋子首先在(1,1),你要移动到(n,m);
谁先移动到终点谁就赢了,注意骑士可能走向平局
题解:
首先国王可以预处理答案
皇后是威佐夫博弈
车是个典型的nim博弈
骑士呢,你注意到有个平局,就是说,如果当前走下一个状态的时候,面临了必败和平局的情况,你是要走平局的,这个点注意一下就能AC了
#include<bits/stdc++.h>
using namespace std;
#pragma comment(linker, "/STACK:102400000,102400000")
#define ls i<<1
#define rs ls | 1
#define mid ((ll+rr)>>1)
#define pii pair<int,int>
#define MP make_pair
typedef long long LL;
const long long INF = 1e18+1LL;
const double Pi = acos(-1.0);
const int N = 3e3+, M = 2e5+, mod = 1e9+, inf = 2e9;
int h[],gw[N][N],qs[N][N];
void init() {
gw[][] = ;
for(int i = ; i <= ; ++i) {
for(int j = ; j <= ; ++j) {
memset(h,,sizeof(h));
if(i>=)h[gw[i-][j]] = ;
if(j>=)h[gw[i][j-]] = ;
if(i>=&&j>=) h[gw[i-][j-]] = ;
if(h[]) gw[i][j]=;
else gw[i][j] = ;
}
}
memset(qs,-,sizeof(qs));
qs[][] = ;int cnt = ;
for(int i = ; i <= ; ++i) {
for(int j = ; j <= ; ++j) {
int ok = ;
memset(h,,sizeof(h));
if(i>=&&j>=&&qs[i-][j-]!=-&&qs[i-][j-]<=)h[qs[i-][j-]] = ,ok = ;
if(j>=&&i>=&&qs[i-][j-]!=-&&qs[i-][j-]<=)h[qs[i-][j-]] = ,ok++;
if(i == && j == ) continue;
if(ok) {
if(h[]) qs[i][j] = ;
else if(!h[] && ok < ) qs[i][j] = -;
else qs[i][j] = ;
}
else qs[i][j] = -; }
}
// cout<<cnt<<endl;
// cout<<qs[1][2]<<endl;
}
int main() {
int T;init();
scanf("%d",&T);
while(T--) {
int type,n,m;
scanf("%d%d%d",&type,&n,&m);
n--,m--;
if(type == ) {//国王
if(gw[n][m])printf("B\n");
else printf("G\n");
} else if(type == ) {//车
if((n ^ m) != )printf("B\n");
else printf("G\n");
} else if(type == ) {//马
if(qs[n][m]==-) printf("D\n");
else if(qs[n][m]) printf("B\n");
else printf("G\n");
} else {//皇后
if(n > m) swap(n,m);
double k = (sqrt()-1.0)/2.0;
int j = n * k;
if(n != (int) (j*(+k))) j++;
if(n + j == m) printf("G\n");
else printf("B\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 (各种博弈) 2016杭电多校联合第三场
题目:传送门 题意:一个国际象棋棋盘,有四种棋子,从(n,m)走到(1,1),走到(1,1)的人赢,先手赢输出B,后手赢输出G,平局输出D. 题解:先把从(n,m)走到(1,1)看做是从(1,1)走到 ...
- 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 题意: 给一个国际象棋的棋盘,起点为(1,1),终点为(n,m),现在每个棋子只能往右下方走,并且有4种不 ...
- 【博弈论】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
四种棋子实质上都是一样的思路: 如果某位置的棋子,它下一步可以走到的位置中 能找到有后手胜的位置,那么该位置先手必胜. 如果某位置的棋子,它下一步可以走到的位置中 全是先手胜,那么该位置后手必胜. 其 ...
- hdu 5754 Life Winner Bo 博弈论
对于king:我是套了一个表. 如果起点是P的话,则是后手赢,否则前手赢. 车:也是画图推出来的. 马:也是推出来的,情况如图咯. 对于后:比赛时竟然推错了.QAQ最后看了题解:是个威佐夫博奕.(2, ...
- HDU5754 Life Winner Bo(博弈)
题目 Source http://acm.hdu.edu.cn/showproblem.php?pid=5754 Description Bo is a "Life Winner" ...
- hdu-5754 Life Winner Bo(博弈)
题目链接: Life Winner Bo Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/ ...
随机推荐
- hibernate中java类的成员变量类型如何映射到SQL中的数据类型变化
hibernate映射文件??.hbm.xml配置映射元素详解--Hibernate映射类型 在从Hibernate的java的成员类型映射到SQL中的数据类型,其内映射方式它满足,SQL可以自己调制 ...
- mysql 主从单库单表同步 binlog-do-db replicate-do-db
方案一:两边做主从. SELECT SUM(DATA_LENGTH)+SUM(INDEX_LENGTH) FROM information_schema.tables WHERE TABLE_SCHE ...
- TCP学习之一:TCP网络编程概念
参考学习张子阳大神的博客:http://www.cnblogs.com/JimmyZhang/category/101698.html 一.TCP 面向连接的(UDP是无连接的) 全双工,建立连接之后 ...
- Toad各版本所包含的组件
Toad for Oracle Base Edition Toad for Oracle Knowledge Xpert for PL/SQL Knowledge Xpert for Oracle A ...
- Adaboost\GBDT\GBRT\组合算法
Adaboost\GBDT\GBRT\组合算法(龙心尘老师上课笔记) 一.Bagging (并行bootstrap)& Boosting(串行) 随机森林实际上是bagging的思路,而GBD ...
- android onCreate中获取view宽高为0的解决方法
view.post(runnable) 通过post可以将一个runnable投递到消息队列的尾部,然后等待UI线程Looper调用此runnable的时候,view也已经初始化好了. view.po ...
- BMP图像差分/比较
#include <stdio.h> #include <stdlib.h> #include <string.h> int main(int argc, char ...
- Linux下的压缩和解压缩命令——zip/unzip
zip命令 zip是个使用广泛的压缩程序,文件经它压缩后会另外产生具有".zip"扩展名 的压缩文件. 选项: -A 调整可执行的自动解压缩文件. -b<工作目录> ...
- 一次erlang 节点CPU严重波动排查
新服务上线后观察到,CPU在10 ~ 70%间波动严重,但从每秒业务计数器看业务处理速度很平均. 接下来是排查步骤: 1. dstat -tam 大概每10s一个周期,网络流量开始变得很小,随后突然增 ...
- Zookeeper开源客户端框架Curator简介
Curator是Netflix开源的一套ZooKeeper客户端框架. Netflix在使用ZooKeeper的过程中发现ZooKeeper自带的客户端太底层, 应用方在使用的时候需要自己处理很多事情 ...