不死「火鸟 −凤翼天翔−」 - 编程题解 & 代码
不死「火鸟 −凤翼天翔−」 - 编程题解 & 代码
拥有了「不死」的能力的藤原妹红,同时获得了操纵火焰的力量,是不死鸟的化身。
不死鸟,和凤凰是同一种生物吗?
题目描述
妹红可以操纵火鸟。火鸟可以看作在边长无限大的棋盘上放置着的一枚棋子 (A),(A) 位于 ((x_1,y_1)) 处。(A) 以如下规则移动:
- 在奇数次移动时,(A) 只能向右上或者左下移动一格,如下图红色箭头;
- 在偶数次移动时,(A) 只能向右下或者左上移动一格,如下图蓝色箭头。

由于棋盘无限大,因此 (x,y) 的取值可以为负数。
每一步行动时 (A) 不能待在原地不移动。现在需要把 (A) 移动到坐标为 ((x_2,y_2)) 的 (B) 位置,最少要多少步?特别地,若不存在这样的方案,输出 (-1)。
如下图所示是 (A=(2,7)),(B=(5,2)) 的情况。一种移动次数最小的方案已在图上标出,需要 (9) 步。红色线段表示奇数次的移动,蓝色线段表示偶数次的移动。

输入格式
输入共一行四个整数 (x_1,y_1,x_2,y_2),描述 (A,B) 的坐标。
输出格式
输出共一行一个整数。如果存在一条从 (A) 到 (B) 的移动方案,输出移动的最小步数;否则输出 (-1)。
样例 #1
样例输入 #1
2 7 5 2
样例输出 #1
9
样例 #2
样例输入 #2
2 2 3 2
样例输出 #2
-1
样例 #3
样例输入 #3
0 0 1000000000 1000000000
样例输出 #3
2000000000
提示
数据范围及约定
对于全部数据,保证 (0\le x_1,y_1,x_2,y_2\le 10^9)。
题解
思路:
仔细观察火鸟的移动规则,我们可以发现:
- 火鸟的横坐标和纵坐标的变化总是同奇同偶的。也就是说,如果横坐标变化了奇数格,纵坐标也必须变化奇数格;如果横坐标变化了偶数格,纵坐标也必须变化偶数格。
- 火鸟每次移动只能改变横坐标或纵坐标,且最多只能改变一格。
因此,如果要判断是否存在从 (A) 到 (B) 的移动方案,只需要检查以下两个条件:
- (x_2 - x_1) 和 (y_2 - y_1) 的奇偶性是否相同。
- (|x_2 - x_1| + |y_2 - y_1|) 是否为偶数。
如果两个条件都满足,那么一定存在移动方案。并且,移动的最小步数就是 (|x_2 - x_1| + |y_2 - y_1|)。
代码实现
#include <iostream>
using namespace std;
int main() {
int x1, y1, x2, y2;
cin >> x1 >> y1 >> x2 >> y2;
if (((x2 - x1) & 1) == ((y2 - y1) & 1) && (abs(x2 - x1) + abs(y2 - y1)) % 2 == 0) {
cout << abs(x2 - x1) + abs(y2 - y1) << endl;
} else {
cout << -1 << endl;
}
return 0;
}
代码解释:
- 代码中使用 (& 1) 来判断一个数的奇偶性。如果一个数 & 1 的结果为 1,则该数为奇数;如果结果为 0,则该数为偶数。
- 代码中使用 (abs(x2 - x1) + abs(y2 - y1)) 来计算从 (A) 到 (B) 的曼哈顿距离,也就是移动的最小步数。
总结
本题是一道简单的逻辑推理题,通过观察火鸟的移动规则,我们可以找到判断是否存在移动方案以及计算最小步数的方法。代码实现也非常简单,只需要根据题意进行判断和计算即可。
原文地址: https://www.cveoy.top/t/topic/plZ9 著作权归作者所有。请勿转载和采集!