AcWing 1237. 螺旋折线
原题链接
中等
作者:
清_1
,
2021-02-25 10:01:42
,
所有人可见
,
阅读 263
算法1
思路:这是一个找规律的题,和蛇形数组很类似,但是数据范围很大,所以需要用long long
然后四个顶点都有规律:右上角(2n)^2,,右下角(2n)(2n+1) ,,左下角(2n-1)^2 ,,左上角(2n-1)(2n),然后每条边上的坐标为矩形的顶点+偏移量,
我这里最开始没有明白偏移量是怎么算的,仔细推敲一下,也能明白,比如(-1,2)这个顶点,就是由(-2,-2)右移1,(-2,-2)这一行纵坐标不变,-2作为起始横坐标为-n,然后向右走,就要用x-(-n)
C++ 代码
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
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;//这里是-n+1!!!
}
return 0;
}