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;
}
BZOJ 3106 棋盘游戏的更多相关文章
- 【BZOJ 3106】 3106: [cqoi2013]棋盘游戏 (对抗搜索)
3106: [cqoi2013]棋盘游戏 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 544 Solved: 233 Description 一个 ...
- BZOJ 3106: [cqoi2013]棋盘游戏(对抗搜索)
题目:http://www.lydsy.com/JudgeOnline/problem.php?id=3106 对抗搜索,f[x][y][a][b][c][d]表示当前谁走,走了几步,及位置. (因为 ...
- BZOJ 3106: [cqoi2013]棋盘游戏
Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 859 Solved: 356[Submit][Status][Discuss] Descriptio ...
- BZOJ 3901 棋盘游戏 (找结论+枚举+贪心)
题面 略 BZOJ 传送门 分析 具体分析见 dalao博客 妙就妙在当i<x,j<xi<x,j<xi<x,j<x时,(i,j)(i,j)(i,j) ^ (i,x) ...
- BZOJ 3901 棋盘游戏 解题报告
这题有个重要性质: 我们设 Flag[i][j] 表示 (i, j) 是否被奇数个操作所覆盖, 也就是操作次数对 2 取模. 设 x = (n + 1) / 2. 那么对于所有的合法的操作方案, 令 ...
- bzoj:1457: 棋盘游戏
原题链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1457 看了网上dalao的题解,好像解释得并不是很清楚,就按照那种思路,自己YY了一个想法 ...
- 博弈论题目总结(二)——SG组合游戏及变形
SG函数 为了更一般化博弈问题,我们引入SG函数 SG函数有如下性质: 1.如果某个状态SG函数值为0,则它后继的每个状态SG函数值都不为0 2.如果某个状态SG函数值不为0,则它至少存在一个后继的状 ...
- 3106: [cqoi2013]棋盘游戏
3106: [cqoi2013]棋盘游戏 链接 分析: 极大极小搜索 + 记忆化. 代码 #include<bits/stdc++.h> using namespace std; type ...
- bzoj千题计划200:bzoj3106: [cqoi2013]棋盘游戏
http://www.lydsy.com/JudgeOnline/problem.php?id=3106 白棋如果第一步不能赢,那么一定输 因为可以黑棋走的距离比白棋大,黑棋可以下一步吃掉白棋,也可以 ...
随机推荐
- volley使用与解析(一)
1.什么是volley Volley是google发布的基于Android平台上的网络通信库,能使网络通信更快,更简单,更健壮.获取地址:git clone https://android.googl ...
- 6 Java学习之 枚举
1. 概念 枚举是一种规范,它规范了参数的形式,这样就可以不用考虑类型的不匹配,并且显示的替代了int型参数可能带来的模糊概念. 常用来定义一个final类型的变量(常量),保证输入安全.如 ...
- myeclipse 解决没有自动提示
有时候myeclipse误操作会丢失自动提示功能,使用.也不出现代码提示,进入window->preferences->java->Editor->Content Assist ...
- BZOJ 2525 Poi2011 Dynamite 二分答案+树形贪心
题目大意:给定一棵树,有一些点是关键点,要求选择不超过mm个点.使得全部关键点到近期的选择的点距离最大值最小 二分答案,问题转化为: 给定一棵树,有一些点是关键点,要求选择最少的点使得每一个关键点到选 ...
- android 29 ArrarAdapter数组适配器
package com.sxt.day05_03; import android.os.Bundle; import android.app.Activity; import android.view ...
- Qt 学习之路:线程和 QObject
前面两个章节我们从事件循环和线程类库两个角度阐述有关线程的问题.本章我们将深入线程间得交互,探讨线程和QObject之间的关系.在某种程度上,这才是多线程编程真正需要注意的问题. 现在我们已经讨论过事 ...
- MD5加密 Java源代码
package lwp; /** * * @author 梁WP */ public class MD5_Encoding { // RFC1321中定义的标准4*4矩阵的常量定义. static f ...
- mssql 创建触发器
MS-SMS里创建触发器: 首先右击表内的触发器文件夹图标 然后输入触发器创建指令,一下案例:(添加创建时间) 创建: SET ANSI_NULLS ON GO SET QUOTED_IDENTIFI ...
- HTML5 Canvas实现刮刮卡效果实例
HTML: <style> #canvas { border: 1px solid blue; position: absolute; left: 10px; top: 10px; bac ...
- 关于C#中的DateTime类型的技巧
* datetime.now.tostring()方法默认的你是无法得到全部的时间的格式的,只能得到日期,得不到具体时间,如果要具体时间,就应该使用 datetime的tostring()重载,dat ...