6859. 【2020.11.14提高组模拟】无尽之前 (game)
Description
给定一个(n imes m)的矩阵,有一个中国象棋里的車,起点在(x,y),目标是走到(x1,y1)
现在你需要放置最少的卒,与車进行博弈,使其无法到达终点(車先手)
输出卒的个数(如无解,输出-1)
Solution
分类讨论
-
当起点与终点相邻时
因为車先手,怎么放都无法阻止它,所以输出-1
-
当(nleqslant 2)或(mleqslant 2)时
当起点不在终点的九宫格内的时候,我们可以直接用两个兵挡住車的去路,如下图
但如果终点已在起点的九宫格内了,则答案就要+1
-
当起点到某个角的切比雪夫距离(leqslant 1)时
这种情况的答案和讨论2是一样的,也是有2、3两种答案
-
其他情况
在起点放置一个兵,再在九宫格内其他位置放两个兵,一定能使車走不到终点
Code
#include <cstdio>
#include <algorithm>
#define open(x) freopen(x".in","r",stdin);freopen(x".out","w",stdout);
using namespace std;
int n,m,x,y,l,r,num;
int abs(int x){return x>=0?x:-x;}
int main()
{
open("game");
scanf("%d%d%d%d%d%d",&n,&m,&x,&y,&l,&r);
if (abs(l-x)+abs(r-y)<=1)
{
printf("-1");
return 0;
}
if (abs(l-n)<=1 && abs(l-1)<=1 && abs(r-m)<=1 && abs(r-1)<=1)
{
printf("1");
return 0;
}
if (n<=2 || m<=2 || max(abs(1-x),abs(1-y))<=1 || max(abs(1-x),abs(m-y))<=1 || max(abs(n-x),abs(1-y))<=1 || max(abs(n-x),abs(m-y))<=1)
{
num=2;
if (max(abs(x-l),abs(y-r))==1) num++;
printf("%d",num);
return 0;
}
printf("3");
return 0;
}