螺旋折线(可能是最简单的找规律)【蓝桥杯2018 C/C++ B组】
标题:螺旋折线
如图p1.png所示的螺旋折线经过平面上所有整点恰好一次。
对于整点(X, Y),我们定义它到原点的距离dis(X, Y)是从原点到(X, Y)的螺旋折线段的长度。
例如dis(0, 1)=3, dis(-2, -1)=9
给出整点坐标(X, Y),你能计算出dis(X, Y)吗?
【输入格式】
X和Y
对于40%的数据,-1000 <= X, Y <= 1000
对于70%的数据,-100000 <= X, Y <= 100000
对于100%的数据, -1000000000 <= X, Y <= 1000000000
【输出格式】
输出dis(X, Y)
【样例输入】
0 1
【样例输出】
3
资源约定:
峰值内存消耗(含虚拟机) < 256M
CPU消耗 < 1000ms
看了很多题解,虽然都是找规律但都比较复杂,终于找到了一篇有比较简单易算规律的题解
代码只有十行 但是不容易想到(可能只是我)
参考自 https://blog.csdn.net/qq799028706/article/details/84312062
思路 :把每一层左下的边旋转90°就能得到该层的正方形,第n层的正方形边长为 n*2*4=8*n ;
要求找点[x,y] ,那么就先找到[x,y]所在的层数 n = max(fabs[x],fabs[y]);
把 1至n-1层正方形的边长之和相加 再加上[x,y]到[-n,-n]需要的边长即可
#include<bits/stdc++.h> using namespace std; typedef long long LL; int main(){ LL x, y; cin >> x >> y; LL n = max(fabs(x), fabs(y)) ; // 判断在第几层的正方形 LL sum = (8 + (8 * (n - 1))) * (n - 1) / 2 ; // 前n-1层四边之和 等差数列求和 if(x < y){ sum += 2 * n + x + y; // 正着数 }else{ sum += n * 8 - 2 * n - x - y; // 倒着数 } cout << sum << endl; }