打卡信奥刷题(740)用C++信奥P9204[普及组/提高] 不死「火鸟 −凤翼天翔−」
不死「火鸟 −凤翼天翔−」
题目背景
拥有了「不死」的能力的藤原妹红,同时获得了操纵火焰的力量,是不死鸟的化身。
不死鸟,和凤凰是同一种生物吗?
题目描述
妹红可以操纵火鸟。火鸟可以看作在边长无限大的棋盘上放置着的一枚棋子 AAA,AAA 位于 (x1,y1)(x_1,y_1)(x1,y1) 处。AAA 以如下规则移动:
- 在奇数次移动时,AAA 只能向右上或者左下移动一格,如下图红色箭头;
- 在偶数次移动时,AAA 只能向右下或者左上移动一格,如下图蓝色箭头。

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

输入格式
输入共一行四个整数 x1,y1,x2,y2x_1,y_1,x_2,y_2x1,y1,x2,y2,描述 A,BA,BA,B 的坐标。
输出格式
输出共一行一个整数。如果存在一条从 AAA 到 BBB 的移动方案,输出移动的最小步数;否则输出 −1-1−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≤x1,y1,x2,y2≤1090\le x_1,y_1,x_2,y_2\le 10^90≤x1,y1,x2,y2≤109。
C++实现
#include
#include
#define int long long
using namespace std;
signed main()
{
int a,b,c,d;
cin>>a>>b>>c>>d;
if((a+b)%2!=(c+d)%2)cout<<-1<<endl;
else if((int)(abs(a-c))%2==0)
cout<<abs(a-c)+abs(b-d)<<endl;
else
cout<<min(abs(a-(c+1))+abs(b-(d+1))+1,abs(a-(c-1))+abs(b-(d-1))+1)<<endl;
return 0;
}

后续
接下来我会不断用C++来实现信奥比赛中的算法题、GESP考级编程题实现、白名单赛事考题实现,记录日常的编程生活、比赛心得,感兴趣的请关注,我后续将继续分享相关内容
更多推荐



所有评论(0)