AcWing||1237. 螺旋折线
活动地址:https://www.acwing.com/activity/content/19/
考察要点:数学 找规律
题目要求
如下图所示的螺旋折线经过平面上所有整点恰好一次。
对于整点 (X,Y),我们定义它到原点的距离 dis(X,Y) 是从原点到 (X,Y) 的螺旋折线段的长度。
例如 dis(0,1)=3,dis(−2,−1)=9
给出整点坐标 (X,Y),你能计算出 dis(X,Y) 吗?
输入格式
包含两个整数 X,Y。
输出格式
输出一个整数,表示 dis(X,Y)。
数据范围:
−109≤X,Y≤109
输入样例:
0 1
输出样例:
3
题目地址:https://www.acwing.com/problem/content/1239/
解析:本题可以直接模拟求出距离,也可以找规律求解,模拟的话就可能会超时。
代码思路 :通过图上的点找规律
可知顶点都有相应的规律,如右上角的顶点都为横坐标 (2x)2 右下角的顶点为2x * (2x+1),知道了顶点的距离,再与对应的坐标求偏移量即可。
- 判断给出的点在那个边上,
上边:abs(x) <= y
下边:abs(x) <= abs(y) + 1 && y < 0
右边:abs(y) <= x
左边:else - 找特殊点,求距离,求偏移量然后求和
注:图为y总视频截图,视频地址在下方
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
typedef long long LL;
int main()
{
int x, y;
cin >> x >> y;
if (abs(x) <= y) // 在上方
{
int n = y;
cout << (LL)(2 * n - 1) * (2 * n) + x - (-n) << endl;
}
else if (abs(y) <= x) // 在右方
{
int n = x;
cout << (LL)(2 * n) * (2 * n) + n - y << endl;
}
else if (abs(x) <= abs(y) + 1 && y < 0) // 在下方
{
int n = abs(y);
cout << (LL)(2 * n) * (2 * n + 1) + n - x << endl;
}
else // 在左方
{
int n = abs(x);
cout << (LL)(2 * n - 1) * (2 * n - 1) + y - (-n + 1) << endl;
}
return 0;
}
本题:1237. 螺旋折线
代码参考:视频讲解