BZOJ 3106 [cqoi 2013] 对抗搜索 解题报告
2017-10-15 20:52
921 查看
3106: [cqoi2013]棋盘游戏
Description
一个n*n(n>=2)棋盘上有黑白棋子各一枚。游戏者A和B轮流移动棋子,A先走。
A的移动规则:只能移动白棋子。可以往上下左右四个方向之一移动一格。
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 2
Sample Output
BLACK 2
【解题报告】
其实我对这个东西算不算对抗搜索表示怀疑。
应该算是一道记忆化搜索,或者迪对抗搜索的简单题吧。。。
代码如下:
Description
一个n*n(n>=2)棋盘上有黑白棋子各一枚。游戏者A和B轮流移动棋子,A先走。
A的移动规则:只能移动白棋子。可以往上下左右四个方向之一移动一格。
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 2
Sample Output
BLACK 2
【解题报告】
其实我对这个东西算不算对抗搜索表示怀疑。
应该算是一道记忆化搜索,或者迪对抗搜索的简单题吧。。。
代码如下:
/************************************************************** Problem: 3106 User: onepointo Language: C++ Result: Accepted Time:2664 ms Memory:107180 kb ****************************************************************/ #include<cstdio> #include<cstring> #include<algorithm> #include<cmath> using namespace std; #define N 21 #define inf 0x3f3f3f3f int dp[2][70] ; int dx[8]={1,0,-1,0,2,0,-2,0}; int dy[8]={0,1,0,-1,0,2,0,-2}; int n,a,b,c,d; int dfs(int x,int y,int a,int b,int c,int d) { if(y>3*n) return inf; if(a==c&&b==d) return (x)?inf:0; if(dp[x][y][a][b][c][d]) return dp[x][y][a][b][c][d]; int ans; if(x) { ans=inf; for(int i=0;i<8;++i) { int xx=c+dx[i],yy=d+dy[i]; if(1<=xx&&xx<=n&&1<=yy&&yy<=n) ans=min(ans,dfs(0,y+1,a,b,xx,yy)); } } else { ans=0; for(int i=0;i<4;++i) { int xx=a+dx[i],yy=b+dy[i]; if(1<=xx&&xx<=n&&1<=yy&&yy<=n) ans=max(ans,dfs(1,y+1,xx,yy,c,d)); } } return dp[x][y][a][b][c][d]=++ans; } int main() { scanf("%d%d%d%d%d",&n,&a,&b,&c,&d); if(abs(a-c)+abs(b-d)==1) puts("WHITE 1"); else printf("BLACK %d",dfs(0,0,a,b,c,d)); return 0; }
相关文章推荐
- BZOJ 3106: [cqoi2013]棋盘游戏(对抗搜索)
- 【BZOJ 3106】 3106: [cqoi2013]棋盘游戏 (对抗搜索)
- [bzoj3106][cqoi2013][棋盘游戏] (对抗搜索+博弈论)
- BZOJ 3107 [cqoi 2013] DP 解题报告
- BZOJ 3193 [JLOI 2013] 计数DP 解题报告
- [BZOJ3109][cqoi2013]新数独 && 搜索
- BZOJ 3109([cqoi2013]新数独-搜索)
- bzoj千题计划200:bzoj3106: [cqoi2013]棋盘游戏
- 【搜索】bzoj3109 [cqoi2013]新数独
- bzoj3106: [cqoi2013]棋盘游戏
- 【BZOJ 3106】【CQOI 2013】棋盘游戏
- BZOJ3503: [Cqoi2014]和谐矩阵 解题报告
- [BZOJ3238][Ahoi2013]差异解题报告|后缀数组
- [BZOJ 4815] [Cqoi2017]小Q的表格 解题报告
- BZOJ 3173 [Tjoi2013] 最长上升子序列 解题报告
- 日期游戏解题报告(对抗搜索的典型运用)
- bzoj3106: [cqoi2013]棋盘游戏 对抗搜索
- BZOJ 3106: [cqoi2013]棋盘游戏
- BZOJ 1379 [Baltic 2001] 解题报告
- BZOJ 3105: [cqoi2013]新Nim游戏