Atcoder Beginner Contest 184C Super Ryuma 题解

题目链接

首先,值得注意的是,我们在一步之内可以沿着对角线走无限个格子。
其次,玩过国际象棋(或做过类似题)的应该知道,将地图交替地黑白染色后,按照走对角线的方法只能走到同颜色的格子,且最多只需要两步即可到达任意一个格子。
那么,在最坏情况下(起点和终点格子颜色不同),我们只需要走 3 3 3 步即可到达目标:
走到一个曼哈顿距离不超过 3 3 3 的异色格子,然后再走两次对角线就可以了

然后,我们开始分类讨论
这里把移动方式分别称为走对角线和走曼哈顿

  • 如果 a n s = 0 ans=0 ans=0,则起点和终点重合
  • 如果 a n s = 1 ans=1 ans=1,则起点和终点在同一对角线上或曼哈顿距离 ≤ 3 \le 3 3
  • 如果 a n s = 2 ans=2 ans=2,则起点终点的格子同色,或者在走一次曼哈顿后可以让起点和终点处在同一对角线上
  • 如果上面条件都不符,那么 a n s = 3 ans=3 ans=3
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
const int Maxn=200000+10;
int x,y,u,v;
inline int read()
{
    
    
	int s=0,w=1;
	char ch=getchar();
	while(ch<'0'||ch>'9'){
    
    if(ch=='-')w=-1;ch=getchar();}
	while(ch>='0' && ch<='9')s=(s<<3)+(s<<1)+(ch^48),ch=getchar();
	return s*w;
}
int main()
{
    
    
	x=read(),y=read(),u=read(),v=read();
	if(x==u && y==v){
    
    puts("0");return 0;}
	if(x-y==u-v || x+y==u+v){
    
    puts("1");return 0;}
	for(int i=x-3;i<=x+3;++i)
	for(int j=y-3;j<=y+3;++j)
	{
    
    
		if(abs(x-i)+abs(y-j)>3)continue;
		if(i==u && j==v){
    
    puts("1");return 0;}
	}
	if((abs(x-u)+abs(y-v))%2==0)
	{
    
    puts("2");return 0;}
	for(int i=x-3;i<=x+3;++i)
	for(int j=y-3;j<=y+3;++j)
	{
    
    
		if(abs(x-i)+abs(y-j)>3)continue;
		if(i-j==u-v || i+j==u+v){
    
    puts("2");return 0;}
	}
	puts("3");
	return 0;
}

猜你喜欢

转载自blog.csdn.net/Brian_Pan_/article/details/109966650
今日推荐