螺旋折线(可能是最简单的找规律)【蓝桥杯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;
}

 


 

 

posted @ 2019-03-22 20:36  llke  阅读(303)  评论(0编辑  收藏  举报