BZOJ 3106 棋盘游戏
Description
一个\(n \times n(n \le 2)\)棋盘上有黑白棋子各一枚。游戏者A和B轮流移动棋子,A先走。
A的移动规则:只能移动白棋子。可以往上下左右四个方向之一移动一格。
B的移动规则:只能移动黑棋子。可以往上下左右四个方向之一移动一格或者两格。
和通常的“吃子”规则一样,当某游戏者把自己的棋子移动到对方棋子所在的格子时,他就赢了。两个游戏者都很聪明,当可以获胜时会尽快获胜,只能输掉的时候会尽量拖延时间。你的任务是判断谁会赢,需要多少回合。
比如\(n=2\),白棋子在\((1,1)\),黑棋子在\((2,2)\),那么虽然A有两种走法,第二个回合B总能取胜。
Input
输入仅一行,包含五个整数\(n, r_{1}, c_{1}, r_{2}, c_{2}\),即棋盘大小和棋子位置。白色棋子在\((r_{1},c_{1})\),黑色棋子在\((r_{2},c_{2})(1 \le r_{1},c_{1},r_{2},c_{2} \le n)\)。黑白棋子的位置保证不相同。
Output
输出仅一行,即游戏结果。如果A获胜,输出WHITE \(x\);如果B获胜,输出BLACK \(x\);如果二者都没有必胜策略,输出DRAW。
Sample Input
2 1 1 2 2
Sample Output
BLACK 2
HINT
\(n \le 20\)
首先有个结论可以判胜负:
如果A与B只相差一格,那么A一定获胜;否则B一定获胜。那个平局只是来卖个萌的。(B走的快一些)
然后就是求合法的步数了,这个是CLB告诉我的极大极小搜索。
我开始裸搜果断TLE,加了记忆化,果断WA,没怎么打过,怎么调也调不对,最后还是参照了别人的程序长了见识。
#include<iostream>
#include<cmath>
#include<cstdio>
#include<cstdlib>
using namespace std;#define inf (1<<30)
#define lim (3*n+2)
#define maxn (25)
const int xx[] = {0,1,0,-1},yy[] = {1,0,-1,0};
int n,X1,X2,Y1,Y2,ans; int vis[maxn][maxn][maxn][maxn][maxn*3][2];inline bool okay(int x,int y) { return x > 0&&x<=n&&y > 0&&y<=n; }inline int dfs(bool now,int a1,int b1,int a2,int b2,int step)
{if (step > lim) return inf;if (vis[a1][b1][a2][b2][step][now]) return vis[a1][b1][a2][b2][step][now];else if (a1 == a2&&b1 == b2){if (now) return inf;return 0;}int ret;if (!now){ret = 0;for (int i = 0;i < 4;++i)if (okay(a1+xx[i],b1+yy[i]))ret = max(dfs(now^1,a1+xx[i],b1+yy[i],a2,b2,step+1),ret);}else{ret = inf;for (int j = 1;j <= 2;++j)for (int i = 0;i < 4;++i)if (okay(a2+j*xx[i],b2+j*yy[i]))ret = min(dfs(now^1,a1,b1,a2+j*xx[i],b2+j*yy[i],step+1),ret);}return vis[a1][b1][a2][b2][step][now] = ++ret;
}int main()
{freopen("3106.in","r",stdin);freopen("3106.out","w",stdout);scanf("%d %d %d %d %d\n",&n,&X1,&Y1,&X2,&Y2);if (abs(X1-X2)+abs(Y1-Y2) == 1) printf("WHITE 1");else{printf("BLACK ");printf("%d",dfs(0,X1,Y1,X2,Y2,0)); }fclose(stdin); fclose(stdout);return 0;
}
转载于:https://www.cnblogs.com/mmlz/p/4306236.html
BZOJ 3106 棋盘游戏相关推荐
- BZOJ刷题记录---提高组难度
BZOJ刷题记录---提高组难度 总目录详见https://blog.csdn.net/mrcrack/article/details/90228694 序号 题号 算法 思想难度 实现难度 总难度 ...
- 博弈论题目总结(二)——SG组合游戏及变形
SG函数 为了更一般化博弈问题,我们引入SG函数 SG函数有如下性质: 1.如果某个状态SG函数值为0,则它后继的每个状态SG函数值都不为0 2.如果某个状态SG函数值不为0,则它至少存在一个后继的状 ...
- BZOJ.1558.[JSOI2009]等差数列(线段树 差分)
BZOJ 洛谷 首先可以把原序列\(A_i\)转化成差分序列\(B_i\)去做. 这样对于区间加一个等差数列\((l,r,a_0,d)\),就可以转化为\(B_{l-1}\)+=\(a_0\),\(B ...
- S-T平面图中利用最短路求最小割(BZOJ 1001)
BZOJ 1001: [BeiJing2006]狼抓兔子 最小割 题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1001 现在小朋友们最喜欢 ...
- BZOJ 1124: [POI2008]枪战Maf(构造 + 贪心)
题意 有 \(n\) 个人,每个人手里有一把手枪.一开始所有人都选定一个人瞄准(有可能瞄准自己).然后他们按某个顺序开枪,且任意时刻只有一个人开枪. 因此,对于不同的开枪顺序,最后死的人也不同. 问最 ...
- BZOJ 2957楼房重建
传送门 线段树 //Twenty #include<cstdio> #include<cstdlib> #include<iostream> #include< ...
- BZOJ.5249.[九省联考2018]iiidx(贪心 线段树)
BZOJ LOJ 洛谷 \(d_i\)不同就不用说了,建出树来\(DFS\)一遍. 对于\(d_i\)不同的情况: Solution 1: xxy tql! 考虑如何把这些数依次填到树里. 首先对于已 ...
- bzoj 4871: [Shoi2017]摧毁“树状图”
4871: [Shoi2017]摧毁"树状图" Time Limit: 25 Sec Memory Limit: 512 MB Submit: 53 Solved: 9 [Su ...
- BZOJ 1592. Making the Grade(思维,数据结构优化DP,以及三个拓展问题)[Usaco2008 Feb]【BZOJ计划】
整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 BZOJ简单题合集x 目录 BZOJ 1592. Making the Grade 拓展问题一 拓展问 ...
最新文章
- Modelsim仿真查看内部信号
- Windows Server Containers 支持 Windows 开发者使用 Docker
- 红外线遥控c语言程序,红外遥控的C程序
- 关于spring 获取不到网站上的xsd的处理记录
- js ejs for语句的第二种遍历用法
- 超声波的四个特性_超声波传感器,超声波的特性
- 如何让Win7不再弹出升级Win10的提醒窗口
- python自学看什么书-如何自学Python ?自学看什么书比较好?
- js-权威指南学习笔记4
- PLSQL Developer 13安装教程
- “伽利略”卫星定位系统
- GetComponentsInChildren 不能获取enabled = false的子物体
- 【ElenmentUI el-date-picker日期选择器,结束时间不得早于开始时间,且只能选择距开始时间指定天数的日期】
- DHT11大气温湿度模块+直流电机实现根据温度控制风扇转动
- jdk11压缩包下载
- 摄像头poe供电原理_如何区分摄像头是否支持PoE供电摄像头?
- GB50345-2012 屋面工程技术规范 免费下载
- WindowsServer2019下Php(php-7.4.3-Win32-vc15-x64) 调用C# .dll文件
- “北斗一号”卫星导航系统与GPS系统比较
- 一键识别行驶证:vue基于百度云智能实现轻松上手
热门文章
- android列表滑到底部,Android中判断listview是否滑动到顶部和底部的实现方法
- android表情输入键盘,GitHub - UKfire/Emotion: 帮你的Android应用快速集成表情键盘
- Qt 解决MySQL 中文乱码问题
- dataloader 源码_pytorch :: Dataloader中的迭代器和生成器应用
- oracle 授权 传递,Oracle基础学习4--Oracle权限传递
- 用数学诠释生命——当今生物信息与计算生物学回顾(一)
- uvalive4744(数论)
- 兔子繁殖(easy)
- golang适合做什么_什么八字适合做销售 适合做销售的八字特征
- linux 目标文件格式,Linux工具 - NM目标文件格式分析