【题解】教主

题目描述

Bessie正在学习如何下象棋。棋盘有P行P列。行和列编号都是0至P-1。
我们可以使用其两个坐标值来描述每个单元格:(r,c)。
Bessie最近了解到其中一个棋子:教主。教主每次的移动方式非常特殊。
不妨假设教主当前所在位置是单元格(r,c),则1次移动可到达的所有单元格包括:
1.(r+k,c+k)形式的所有单元格,其中k是正整数。
2.(r+k,c-k)形式的所有单元格,其中k是正整数。
3.(r-k,c+k)形式的所有单元格,其中k是正整数。
4.(r-k,c-k)形式的所有单元格,其中k是正整数。
当然,教主必须始终在棋盘内,不能走到棋盘外面。
现在Bessie拿来了一个空的棋盘,他把一个教主放在格子(r1,c1)。
他现在想要使用尽可能少的移动将其移动到单元格(r2,c2),请输出最小的移动次数。
如果教主不可能到达目标单元格,则返回-1。

输入输出格式

输入格式:

一行,5个整数:P,r1,c1,r2,c2。

输出格式:

一个整数。

输入输出样例

输入样例一:

8 4 6 7 3

输出样例一:

1

因为教主最多走2步就可以到达棋盘上所有可到达的点
所以先判断该点是否可以被到达,如果c2-c1的绝对值的奇偶性与r2-r1的绝对值的奇偶性相同,就说明该点可到达
如果c2-c1的绝对值与r2-r1的绝对值相同,那么1步就能到达。
程序如下:

#include<bits/stdc++.h>
using namespace std;
int P,r1,c1,r2,c2;
int main()
{
	cin>>P>>r1>>c1>>r2>>c2;
	if(r1==r2&&c1==c2)
	{
		cout<<0;
		return 0;
	}
	if(abs(c2-c1)==abs(r2-r1))
	{
		cout<<1;
		return 0;
	}
	if(abs(c2-c1)%2==abs(r2-r1)%2) cout<<2;
	else cout<<-1;
}
原文地址:https://www.cnblogs.com/2021-yanghaoran/p/11585620.html