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 棋盘游戏相关推荐

  1. BZOJ刷题记录---提高组难度

    BZOJ刷题记录---提高组难度 总目录详见https://blog.csdn.net/mrcrack/article/details/90228694 序号 题号 算法 思想难度 实现难度 总难度 ...

  2. 博弈论题目总结(二)——SG组合游戏及变形

    SG函数 为了更一般化博弈问题,我们引入SG函数 SG函数有如下性质: 1.如果某个状态SG函数值为0,则它后继的每个状态SG函数值都不为0 2.如果某个状态SG函数值不为0,则它至少存在一个后继的状 ...

  3. BZOJ.1558.[JSOI2009]等差数列(线段树 差分)

    BZOJ 洛谷 首先可以把原序列\(A_i\)转化成差分序列\(B_i\)去做. 这样对于区间加一个等差数列\((l,r,a_0,d)\),就可以转化为\(B_{l-1}\)+=\(a_0\),\(B ...

  4. S-T平面图中利用最短路求最小割(BZOJ 1001)

    BZOJ 1001: [BeiJing2006]狼抓兔子 最小割 题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1001 现在小朋友们最喜欢 ...

  5. BZOJ 1124: [POI2008]枪战Maf(构造 + 贪心)

    题意 有 \(n\) 个人,每个人手里有一把手枪.一开始所有人都选定一个人瞄准(有可能瞄准自己).然后他们按某个顺序开枪,且任意时刻只有一个人开枪. 因此,对于不同的开枪顺序,最后死的人也不同. 问最 ...

  6. BZOJ 2957楼房重建

    传送门 线段树 //Twenty #include<cstdio> #include<cstdlib> #include<iostream> #include< ...

  7. BZOJ.5249.[九省联考2018]iiidx(贪心 线段树)

    BZOJ LOJ 洛谷 \(d_i\)不同就不用说了,建出树来\(DFS\)一遍. 对于\(d_i\)不同的情况: Solution 1: xxy tql! 考虑如何把这些数依次填到树里. 首先对于已 ...

  8. bzoj 4871: [Shoi2017]摧毁“树状图”

    4871: [Shoi2017]摧毁"树状图" Time Limit: 25 Sec  Memory Limit: 512 MB Submit: 53  Solved: 9 [Su ...

  9. BZOJ 1592. Making the Grade(思维,数据结构优化DP,以及三个拓展问题)[Usaco2008 Feb]【BZOJ计划】

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 BZOJ简单题合集x 目录 BZOJ 1592. Making the Grade 拓展问题一 拓展问 ...

最新文章

  1. Modelsim仿真查看内部信号
  2. Windows Server Containers 支持 Windows 开发者使用 Docker
  3. 红外线遥控c语言程序,红外遥控的C程序
  4. 关于spring 获取不到网站上的xsd的处理记录
  5. js ejs for语句的第二种遍历用法
  6. 超声波的四个特性_超声波传感器,超声波的特性
  7. 如何让Win7不再弹出升级Win10的提醒窗口
  8. python自学看什么书-如何自学Python ?自学看什么书比较好?
  9. js-权威指南学习笔记4
  10. PLSQL Developer 13安装教程
  11. “伽利略”卫星定位系统
  12. GetComponentsInChildren 不能获取enabled = false的子物体
  13. 【ElenmentUI el-date-picker日期选择器,结束时间不得早于开始时间,且只能选择距开始时间指定天数的日期】
  14. DHT11大气温湿度模块+直流电机实现根据温度控制风扇转动
  15. jdk11压缩包下载
  16. 摄像头poe供电原理_如何区分摄像头是否支持PoE供电摄像头?
  17. GB50345-2012 屋面工程技术规范 免费下载
  18. WindowsServer2019下Php(php-7.4.3-Win32-vc15-x64) 调用C# .dll文件
  19. “北斗一号”卫星导航系统与GPS系统比较
  20. 一键识别行驶证:vue基于百度云智能实现轻松上手

热门文章

  1. android列表滑到底部,Android中判断listview是否滑动到顶部和底部的实现方法
  2. android表情输入键盘,GitHub - UKfire/Emotion: 帮你的Android应用快速集成表情键盘
  3. Qt 解决MySQL 中文乱码问题
  4. dataloader 源码_pytorch :: Dataloader中的迭代器和生成器应用
  5. oracle 授权 传递,Oracle基础学习4--Oracle权限传递
  6. 用数学诠释生命——当今生物信息与计算生物学回顾(一)
  7. uvalive4744(数论)
  8. 兔子繁殖(easy)
  9. golang适合做什么_什么八字适合做销售 适合做销售的八字特征
  10. linux 目标文件格式,Linux工具 - NM目标文件格式分析