题解:UVA10849 Move the bishop

UVA10849 Move the bishop

题目大意

给定一张 N×NN \times N 的空棋盘。你有一个“象”,要从位置 A(x1,y1)A(x_1,y_1) 走到位置 B(x2,y2)B(x_2,y_2),问最少要几步。

题目分析

首先我们来看一张棋盘,象在位置 (2,5)(2,5)

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

我们接着来观察对角线性质。

发现主对角线(黄色)上的格子横纵坐标之为定值;副对角线(蓝色)上的格子横纵坐标之为定值。据此判断两点是否在同一对角线上。

接着研究最少步数。

不难发现:位于同一对角线上,只需 11 步;不在同一对角线上,只需 22 步(可以把棋盘倾斜 4545^\circ,类比车的移动)。

代码

#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/
作者
PvbeLLN
发布于
2025年7月11日
许可协议