【BZOJ 3106】 3106: [cqoi2013]棋盘游戏 (对抗搜索)

2023-10-19 16:40

本文主要是介绍【BZOJ 3106】 3106: [cqoi2013]棋盘游戏 (对抗搜索),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

3106: [cqoi2013]棋盘游戏

Time Limit: 10 Sec  Memory Limit: 128 MB
Submit: 544  Solved: 233

Description

一个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 2

Sample Output

BLACK 2

HINT

n<=20

Source

 

 

【分析】

  BLACK腿长所以能赢?

  只有WHITE第一步能赢才能赢。

  后面的事情,直接随便搜搜就好了。

 

 1 #include<cstdio>
 2 #include<cstdlib>
 3 #include<cstring>
 4 #include<iostream>
 5 #include<algorithm>
 6 using namespace std;
 7 #define INF 0xfffffff
 8 
 9 int f[2][61][21][21][21][21];
10 int n;
11 
12 int ffind(int p,int x,int r1,int c1,int r2,int c2)
13 {
14     if(x>3*n) return INF;
15     if(r1==r2&&c1==c2) return p?INF:0;
16     if(f[p][x][r1][c1][r2][c2]) return f[p][x][r1][c1][r2][c2];
17     int ans;
18     if(p)
19     {
20         ans=INF;
21         if(r2>1) ans=min(ans,ffind(p^1,x+1,r1,c1,r2-1,c2));
22         if(r2>2) ans=min(ans,ffind(p^1,x+1,r1,c1,r2-2,c2));
23         if(c2>1) ans=min(ans,ffind(p^1,x+1,r1,c1,r2,c2-1));
24         if(c2>2) ans=min(ans,ffind(p^1,x+1,r1,c1,r2,c2-2));
25         if(r2<n) ans=min(ans,ffind(p^1,x+1,r1,c1,r2+1,c2));
26         if(r2+1<n) ans=min(ans,ffind(p^1,x+1,r1,c1,r2+2,c2));
27         if(c2<n) ans=min(ans,ffind(p^1,x+1,r1,c1,r2,c2+1));
28         if(c2+1<n) ans=min(ans,ffind(p^1,x+1,r1,c1,r2,c2+2));
29     }
30     else
31     {
32         ans=0;
33         if(r1>1) ans=max(ans,ffind(p^1,x+1,r1-1,c1,r2,c2));
34         if(c1>1) ans=max(ans,ffind(p^1,x+1,r1,c1-1,r2,c2));
35         if(r1<n) ans=max(ans,ffind(p^1,x+1,r1+1,c1,r2,c2));
36         if(c1<n) ans=max(ans,ffind(p^1,x+1,r1,c1+1,r2,c2));
37     }
38     ans++;
39     f[p][x][r1][c1][r2][c2]=ans;
40     return ans;
41 }
42 
43 int main()
44 {
45     int r1,c1,r2,c2;
46     memset(f,0,sizeof(f));
47     scanf("%d%d%d%d%d",&n,&r1,&c1,&r2,&c2);
48     if((abs(r1-r2)+abs(c1-c2))<=1) printf("WHITE 1\n");
49     else printf("BLACK %d\n",ffind(0,0,r1,c1,r2,c2));
50     return 0;
51 }
View Code

 

2017-04-11 20:13:55

转载于:https://www.cnblogs.com/Konjakmoyu/p/6695440.html

这篇关于【BZOJ 3106】 3106: [cqoi2013]棋盘游戏 (对抗搜索)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/241065

相关文章

Python开发围棋游戏的实例代码(实现全部功能)

《Python开发围棋游戏的实例代码(实现全部功能)》围棋是一种古老而复杂的策略棋类游戏,起源于中国,已有超过2500年的历史,本文介绍了如何用Python开发一个简单的围棋游戏,实例代码涵盖了游戏的... 目录1. 围棋游戏概述1.1 游戏规则1.2 游戏设计思路2. 环境准备3. 创建棋盘3.1 棋盘类

C# ComboBox下拉框实现搜索方式

《C#ComboBox下拉框实现搜索方式》文章介绍了如何在加载窗口时实现一个功能,并在ComboBox下拉框中添加键盘事件以实现搜索功能,由于数据不方便公开,作者表示理解并希望得到大家的指教... 目录C# ComboBox下拉框实现搜索步骤一步骤二步骤三总结C# ComboBox下拉框实现搜索步骤一这

认识、理解、分类——acm之搜索

普通搜索方法有两种:1、广度优先搜索;2、深度优先搜索; 更多搜索方法: 3、双向广度优先搜索; 4、启发式搜索(包括A*算法等); 搜索通常会用到的知识点:状态压缩(位压缩,利用hash思想压缩)。

hdu1240、hdu1253(三维搜索题)

1、从后往前输入,(x,y,z); 2、从下往上输入,(y , z, x); 3、从左往右输入,(z,x,y); hdu1240代码如下: #include<iostream>#include<algorithm>#include<string>#include<stack>#include<queue>#include<map>#include<stdio.h>#inc

hdu 4517 floyd+记忆化搜索

题意: 有n(100)个景点,m(1000)条路,时间限制为t(300),起点s,终点e。 访问每个景点需要时间cost_i,每个景点的访问价值为value_i。 点与点之间行走需要花费的时间为g[ i ] [ j ] 。注意点间可能有多条边。 走到一个点时可以选择访问或者不访问,并且当前点的访问价值应该严格大于前一个访问的点。 现在求,从起点出发,到达终点,在时间限制内,能得到的最大

国产游戏崛起:技术革新与文化自信的双重推动

近年来,国产游戏行业发展迅猛,技术水平和作品质量均得到了显著提升。特别是以《黑神话:悟空》为代表的一系列优秀作品,成功打破了过去中国游戏市场以手游和网游为主的局限,向全球玩家展示了中国在单机游戏领域的实力与潜力。随着中国开发者在画面渲染、物理引擎、AI 技术和服务器架构等方面取得了显著进展,国产游戏正逐步赢得国际市场的认可。然而,面对全球游戏行业的激烈竞争,国产游戏技术依然面临诸多挑战,未来的

AI基础 L9 Local Search II 局部搜索

Local Beam search 对于当前的所有k个状态,生成它们的所有可能后继状态。 检查生成的后继状态中是否有任何状态是解决方案。 如果所有后继状态都不是解决方案,则从所有后继状态中选择k个最佳状态。 当达到预设的迭代次数或满足某个终止条件时,算法停止。 — Choose k successors randomly, biased towards good ones — Close

hdu4277搜索

给你n个有长度的线段,问如果用上所有的线段来拼1个三角形,最多能拼出多少种不同的? import java.io.BufferedInputStream;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStream;import java.io.InputStreamReader;

火柴游戏java版

代码 /*** 火柴游戏* <p>* <li>有24根火柴</li>* <li>组成 A + B = C 等式</li>* <li>总共有多少种适合方式?</li>* <br>* <h>分析:</h>* <li>除去"+"、"="四根,最多可用火柴根数20根。</li>* <li>全部用两根组合成"1",最大数值为1111。使用枚举法,A和B范围在0~1111,C为A+B。判断</li>** @

国产游戏行业的崛起与挑战:技术创新引领未来

国产游戏行业的崛起与挑战:技术创新引领未来 近年来,国产游戏行业蓬勃发展,技术水平不断提升,许多优秀作品在国际市场上崭露头角。从画面渲染到物理引擎,从AI技术到服务器架构,国产游戏已实现质的飞跃。然而,面对全球游戏市场的激烈竞争,国产游戏技术仍然面临诸多挑战。本文将探讨这些挑战,并展望未来的机遇,深入分析IT技术的创新将如何推动行业发展。 国产游戏技术现状 国产游戏在画面渲染、物理引擎、AI