【题解】教主
题目描述
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;
}