title: 蓝桥杯 螺旋矩阵(找规律)
date: 2020-05-10 16:45:16
tags:
- 蓝桥杯
题目大意
题目链接
如图所示的螺旋折线经过平面上所有整点恰好一次。
对于整点(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)
样例
输入
0 1
输出
3
提示
数据规模
对于40%的数据,-1000 <= X, Y <= 1000
对于70%的数据,-100000 <= X, Y <= 100000
对于100%的数据, -1000000000 <= X, Y <= 1000000000
解题思路
本题本来直接模拟大概能过80%的数据,其实直接找规律就行,可以看下图,我们把它补全成正方形,相邻两个正方形的差为8,成等差数列。然后每次相对左下角开始算需要求的位置与该位置的距离
代码
#include<cstdio>
#include<iostream>
#include<math.h>
#include<algorithm>
#define ll long long
using namespace std;
int main(void) {
int x, y;
cin >> x >> y;
ll n = max(abs(x), abs(y));
ll ans = 0;
ll temp = 0;
if (x >= y) {
ans = 8 * n + n * (n - 1) * 8 / 2;//除2要放在后面哦,不然可能有误差
temp = x + n + y + n;
ans -= temp;
}
else {
temp = x + n + y + n;
n--;
ans = 8 * n + n * (n - 1) * 8 / 2; //这里算的是n-1层总共的路程
ans += temp;
}
cout << ans;
return 0;
}