不死「火鸟 −凤翼天翔−」 - 编程题解 & 代码

拥有了「不死」的能力的藤原妹红,同时获得了操纵火焰的力量,是不死鸟的化身。

不死鸟,和凤凰是同一种生物吗?

题目描述

妹红可以操纵火鸟。火鸟可以看作在边长无限大的棋盘上放置着的一枚棋子 (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) 的移动方案,只需要检查以下两个条件:

  1. (x_2 - x_1) 和 (y_2 - y_1) 的奇偶性是否相同。
  2. (|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 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录