6859. 【2020.11.14提高组模拟】无尽之前

63 篇文章 0 订阅

Background

雏见泽,一个和平的,或者说本应和平的小村庄,却因连续四年的怪死事件而蒙上了阴影。 无一例外,每年的事件都发生在棉流祭当晚。一人死亡,一人失踪。是御社神的作祟, 还是另有隐情?人们这样议论着。
六月已至,一年一度的棉流祭之火又将重新燃起。平日里冷清的集市渐渐热闹起来,人 们的欢声笑语环绕着这个宁静的小村庄。而同时,在不知名的角落里,也有些许不安的种子在无声的发芽。蓝色长发的少女站在山巅上,冷冷地看着山下即将发生的一切。“这次,又将是谁呢?”身后的人影无声地点头。

Description

这是开始前的故事。羽入和小梨花在 n m 的棋盘上下棋,其中行从 1 n 标号,列从 1 到 m 标号。棋盘上有两种棋子:车和兵。车每次可以往四个方向走任意格,直到在某个空地停下或者碰到一个兵把兵吃掉并停下来。兵每次可以往四个方向走一格,要求格子是空地或者是车,如果是车则将车吃掉。现在羽入控制车,梨花控制兵,车初始在 ( x 1 , y 1 ) ,终点在 ( x 2 , y 2 ),如果车走到了终点(无论下一步是否存活)则羽入获胜,否则若车被吃了或者羽入在 10100000 步内无法获胜则梨花获胜。双方每次只能移动自己的某一个棋子走一步(也可以选择不移动)。棋盘初始只有一个车,梨花在开始前可以选择在任意非车位置(包括终点)放兵,接着
羽入先手操作车,之后两人轮流操作。因为羽入除了会啊呜啊呜以外还很聪明,所以梨花想知道自己需要放的最少兵的数量,使得两人都按照最优策略进行时自己可以获胜,如果无解输出 -1。

Input

一行六个数 n, m, x 1 , y 1 , x 2 , y 2 ,分别表示棋盘的大小、车的起始位置、终点位置

Output

一行一个数表示答案,无解输出 -1
 

Sample Input

2 3 1 1 2 3

Sample Output

2
【样例解释】
(1 , 2) , (2 , 2) 处放两个兵,显然车无法到达终点。

Data Constraint

对于 100 % 的数据保证起点终点不相同, n, m 300 , 1 x 1 , x 2 n, 1 y 1 , y 2 m
数据点编号
1,2,3           n, m 3
4,5,6           n, m 50
7,8,9,10      n, m 300
 

Solution

  • subtask1a

特点:起点终点相邻

显然只要一步即可走到终点,无论怎样都挡不住,因此答案为-1

  • subtask2

特点:终点到四边界距离<=1

在终点放一个兵即可,车无法走到兵的周围四格子,因此答案为1

  • subtask3

特点:n<=2或m<=2

如果n或m=1则连着放两个,否则竖/横着放两个,车如果冲过去吃一个兵会被另一个兵吃掉,因此答案为2

  • subtask3.5

答案为3的特殊情况,只可能是车初始在终点的九宫格以内,因为通常情况下车无法走入九宫格 只可能是n=2,且终点到上下两边距离1,同时车在终点的斜角处

因为这样车可以往后退,同时压住兵不能移动,然后就可以获胜了 如果到左右两边有距离为1的,则可以横着放两个兵,这样答案还是2

  • subtask4

特点:终点到某个角的切比雪夫距离<=1(在角落或在角落旁边)

在终点放一个,在与终点相连的靠近起点的位置/终点的斜角上放一个,车转不过来,因此答案为2

  • subtask4.5

答案为3的特殊情况,和上面类似,车可以往后退同时压住兵,只有在九宫格内并且能往外走

因为距离角只有一格,所以只能在朝外的斜角处,这样车可以往两边退,答案为3

  • subtask5

特点:除了上面四种情况的

在终点放一个,在终点九宫格内放两个(斜着放两个),如果车走到终点的同一行或列 ,兵就走过去堵上终点,否则兵回到原来位置上。

Code

#include<cstdio> 
#include<algorithm>
using namespace std;
int n,m,x1,y1,x2,y2;
int main(){
	freopen("game.in","r",stdin);
	freopen("game.out","w",stdout);
	scanf("%d%d%d%d%d%d",&n,&m,&x1,&y1,&x2,&y2);
	printf((abs(x1-x2)+abs(y1-y2)==1)?"-1\n":(n<=2&&m<=2||(n<=3&&m<=3&&x2==2&&y2==2))?"1\n":
	(n==1||m==1||(n==2&&abs(y1-y2)>1)||(m==2&&abs(x1-x2)>1)||abs(x1-x2)+abs(y1-y2)!=2&&(x2<=2||x2>=n-1)&&y2<=2||y2>=m-1)?"2\n":"3\n");
	return 0;
}

 

 
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值