【BZOJ 3106】 3106: [cqoi2013]棋盘游戏 (对抗搜索)
3106: [cqoi2013]棋盘游戏
Time Limit: 10 Sec Memory Limit: 128 MB
Submit: 544 Solved: 233Description
一个n*n(n>=2)棋盘上有黑白棋子各一枚。游戏者A和B轮流移动棋子,A先走。l A的移动规则:只能移动白棋子。可以往上下左右四个方向之一移动一格。l B的移动规则:只能移动黑棋子。可以往上下左右四个方向之一移动一格或者两格。和通常的“吃子”规则一样,当某游戏者把自己的棋子移动到对方棋子所在的格子时,他就赢了。两个游戏者都很聪明,当可以获胜时会尽快获胜,只能输掉的时候会尽量拖延时间。你的任务是判断谁会赢,需要多少回合。比如n=2,白棋子在(1,1),黑棋子在(2,2),那么虽然A有两种走法,第二个回合B总能取胜。Input
输入仅一行,包含五个整数n, r1, c1, r2, c2,即棋盘大小和棋子位置。白色棋子在(r1,c1),黑色棋子在(r2,c2)(1<=r1,c1,r2,c2<=n)。黑白棋子的位置保证不相同。Output
输出仅一行,即游戏结果。如果A获胜,输出WHITE x;如果B获胜,输出BLACK x;如果二者都没有必胜策略,输出DRAW。Sample Input
2 1 1 2 2Sample Output
BLACK 2HINT
n<=20
Source
【分析】
BLACK腿长所以能赢?
只有WHITE第一步能赢才能赢。
后面的事情,直接随便搜搜就好了。
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
#define INF 0xfffffff int f[][][][][][];
int n; int ffind(int p,int x,int r1,int c1,int r2,int c2)
{
if(x>*n) return INF;
if(r1==r2&&c1==c2) return p?INF:;
if(f[p][x][r1][c1][r2][c2]) return f[p][x][r1][c1][r2][c2];
int ans;
if(p)
{
ans=INF;
if(r2>) ans=min(ans,ffind(p^,x+,r1,c1,r2-,c2));
if(r2>) ans=min(ans,ffind(p^,x+,r1,c1,r2-,c2));
if(c2>) ans=min(ans,ffind(p^,x+,r1,c1,r2,c2-));
if(c2>) ans=min(ans,ffind(p^,x+,r1,c1,r2,c2-));
if(r2<n) ans=min(ans,ffind(p^,x+,r1,c1,r2+,c2));
if(r2+<n) ans=min(ans,ffind(p^,x+,r1,c1,r2+,c2));
if(c2<n) ans=min(ans,ffind(p^,x+,r1,c1,r2,c2+));
if(c2+<n) ans=min(ans,ffind(p^,x+,r1,c1,r2,c2+));
}
else
{
ans=;
if(r1>) ans=max(ans,ffind(p^,x+,r1-,c1,r2,c2));
if(c1>) ans=max(ans,ffind(p^,x+,r1,c1-,r2,c2));
if(r1<n) ans=max(ans,ffind(p^,x+,r1+,c1,r2,c2));
if(c1<n) ans=max(ans,ffind(p^,x+,r1,c1+,r2,c2));
}
ans++;
f[p][x][r1][c1][r2][c2]=ans;
return ans;
} int main()
{
int r1,c1,r2,c2;
memset(f,,sizeof(f));
scanf("%d%d%d%d%d",&n,&r1,&c1,&r2,&c2);
if((abs(r1-r2)+abs(c1-c2))<=) printf("WHITE 1\n");
else printf("BLACK %d\n",ffind(,,r1,c1,r2,c2));
return ;
}
2017-04-11 20:13:55
【BZOJ 3106】 3106: [cqoi2013]棋盘游戏 (对抗搜索)的更多相关文章
- [bzoj3106][cqoi2013][棋盘游戏] (对抗搜索+博弈论)
Description 一个n*n(n>=2)棋盘上有黑白棋子各一枚.游戏者A和B轮流移动棋子,A先走. l A的移动规则:只能移动白棋子.可以往上下左右四个方向之一移动一格. ...
- BZOJ 3106: [cqoi2013]棋盘游戏(对抗搜索)
题目:http://www.lydsy.com/JudgeOnline/problem.php?id=3106 对抗搜索,f[x][y][a][b][c][d]表示当前谁走,走了几步,及位置. (因为 ...
- 3106: [cqoi2013]棋盘游戏
3106: [cqoi2013]棋盘游戏 链接 分析: 极大极小搜索 + 记忆化. 代码 #include<bits/stdc++.h> using namespace std; type ...
- 【BZOJ3106】[CQOI2013] 棋盘游戏(对抗搜索)
点此看题面 大致题意: 在一张\(n*n\)的棋盘上有一枚黑棋子和一枚白棋子.白棋子先移动,然后是黑棋子.白棋子每次可以向上下左右四个方向中任一方向移动一步,黑棋子每次则可以向上下左右四个方向中任一方 ...
- BZOJ.5248.[九省联考2018]一双木棋chess(对抗搜索 记忆化)
BZOJ 洛谷P4363 [Update] 19.2.9 重做了遍,感觉之前写的有点扯= = 首先棋子的放置情况是阶梯状的. 其次,无论已经放棋子的格子上哪些是黑棋子哪些是白棋子,之前得分如何,两人在 ...
- 博弈论经典算法(一)——对抗搜索与Alpha-Beta剪枝
前言 在一些复杂的博弈论题目中,每一轮操作都可能有许多决策,于是就会形成一棵庞大的博弈树. 而有一些博弈论题没有什么规律,针对这样的问题,我们就需要用一些十分玄学的算法. 例如对抗搜索. 对抗搜索简介 ...
- bzoj3106 [cqoi2013]棋盘游戏
Description 一个n*n(n>=2)棋盘上有黑白棋子各一枚.游戏者A和B轮流移动棋子,A先走. l A的移动规则:只能移动白棋子.可以往上下左右四个方向之一移动一格. ...
- P2962 [USACO09NOV]灯Lights 对抗搜索
\(\color{#0066ff}{题目描述}\) 贝希和她的闺密们在她们的牛棚中玩游戏.但是天不从人愿,突然,牛棚的电源跳闸了,所有的灯都被关闭了.贝希是一个很胆小的女生,在伸手不见拇指的无尽的黑暗 ...
- P4363 [九省联考2018]一双木棋chess(对抗搜索+记忆化搜索)
传送门 这对抗搜索是个啥玩意儿…… 首先可以发现每一行的棋子数都不小于下一行,且局面可由每一行的棋子数唯一表示,那么用一个m+1进制数来表示当前局面,用longlong存,开map记忆化搜索 然后时间 ...
随机推荐
- autofac 在.net core 与经典asp.net中的差异
前提: Install-Package Microsoft.Extensions.DependencyInjection 特點: 使用nstancePerLifetimeScope代替Instance ...
- document.write 简介
document.write 的执行分两种情况: 第一种:dom加载已完成 1. 执行 document.open() (即会清空document) 2. 执行 document.write() 3. ...
- shell编程===执行shell脚本的四种方法
使用vim创建一个shell文件,命名 hello.sh #!/bin/bash echo "hello shell !" 在linux中进行加载 chmod +x ./hello ...
- 136.Single Number---异或、位运算
题目链接 题目大意:给出一串数组,里面的数都是两个,只有一个数是一个,把这个只有一个的数找出来.时间复杂度最好是线性的,空间复杂度最好为O(1). 法一:利用map,空间换时间,代码如下(耗时26ms ...
- centos7下vi的用法
vi编辑器是所有Unix及Linux系统下标准的编辑器,它的强大不逊色于任何最新的文本编辑器,这里只是简单地介绍一下它的用法和一小部分指令.由于对Unix及Linux系统的任何版本,vi编辑器是完全相 ...
- C/C++——static修饰符
1. static变量 static 用来说明静态变量.如果是在函数外面定义的,那么其效果和全局变量类似,但是,static定义的变量只能在当前c程序文件中使用,在另一个c代码里面,即使使用exter ...
- Java文件上传与下载
文件上传与下载可谓上网中的常见现象.apache为我们准备了用于文件上传与下载的两个jar包(commons-fileupload-1.2.1.jar,commons-io-1.4.jar).我们在w ...
- java基础12 抽象类(及关键字:abstract)
抽象类:abstract 1.应用的场景 我们描述一类事物时,存在着某种行为,但这种行为目前不具体,那么我们就可以抽取这种行为的声明,但是不去实现这种行为,我们就需要使用抽象类. 2.抽象的好处 强制 ...
- spring源码分析---事务篇
上一篇我介绍了spring事务的传播特性和隔离级别,以及事务定义的先关接口和类的关系.我们知晓了用TransactionTemplate(或者直接用底层P的latformTransactionMana ...
- ios app应用在显示屏幕上改中文名
1.点击项目名 2.选Build settings 搜索 product name 3.双击,改为需要在手机上显示的应用名