题解:UVA10849 Move the bishop
UVA10849 Move the bishop
题目大意
给定一张 的空棋盘。你有一个“象”,要从位置 走到位置 ,问最少要几步。
题目分析
首先我们来看一张棋盘,象在位置 。

注意到象只能沿对角线走,那么象只能到达和自己当前所处格子同色的格子。不难发现白格横纵坐标之差为奇数,黑格横纵坐标之差为偶数。据此判断是否可达。
我们接着来观察对角线性质。

发现主对角线(黄色)上的格子横纵坐标之和为定值;副对角线(蓝色)上的格子横纵坐标之差为定值。据此判断两点是否在同一对角线上。
接着研究最少步数。

不难发现:位于同一对角线上,只需 步;不在同一对角线上,只需 步(可以把棋盘倾斜 ,类比车的移动)。
代码
#include<iostream>
using namespace std;
inline int read() {
char c=getchar();int x=0,f=1;
for(;!isdigit(c);c=getchar())if(c=='-')f=-1;
for(;isdigit(c);c=getchar())x=x*10+c-48;
return x*f;
}
#define r(a) (a)=read()
int kase,T,n,x,y,p,q;
signed main() {
r(kase);
while (kase--) {
r(T); r(n);
while (T--) {
r(x); r(y); r(p); r(q);
if (abs(x-y)%2 != abs(p-q)%2) //奇偶性不同,不可达
puts("no move");
else if (x==p && y==q) //特判:起点和终点重合
printf("0\n");
else if (x+y==p+q || x-y==p-q) //在同一对角线上
printf("1\n");
else //其他情况
printf("2\n");
}
}
return 0;
}题解:UVA10849 Move the bishop
https://pvbelln.github.io/2025/07/11/sol-uva10849/