目测一个找规律题目,不知道写得对不对。。。
规律还是蛮好找的:第一象限(包括x轴正半轴,y轴正半轴),以x,y相等的坐标为基点,然后再根据所求点与基点的关系求得dis。
第二,四象限亦是如此。稍微特殊的第三象限,也能较快地看出规律。在注释中已经注明
#include <bits/stdc++.h> //蓝桥 2018省赛 螺旋折线:long long范围在9.22e18,在计算过程中不会超出long long范围
using namespace std;
int main()
{
long long int x,y;
scanf("%lld %lld",&x,&y);
long long step;
long long int temp;
long long int x1,y1;
if(x>=0 && y>=0) //第一象限,y轴正半轴,x轴正半轴
{
temp=max(x,y); //取x,y的最大值
temp*=2; //最大值乘2平方后得到基点的dis
step=temp*temp; //第一象限x==y时dis
if(x!=y) //如果x!=y
{
if(x<y) //如果x<y,根据图像的规律可得到dis
step-=(y-x);
else
step+=(x-y);
}
}
if(x>=0 && y<0) //第四象限,y轴负半轴(由第一象限基点推得dis)
{
x1=x,y1=-y;
temp=max(x1,y1);
temp*=2;
step=temp*temp+temp; //先得到第四象限基点dis
if(x1!=y1) //与第一象限相同,对不是基点的点dis进行处理
{
if(x1>y1)
step-=(x1-y1);
else
step+=(y1-x1);
}
}
if(x<=0 && y>0) //第二象限,x轴负半轴
{
x1=-x,y1=y;
temp=max(x1,y1);
temp*=2;
step=temp*temp-temp;//在第一象限的基点dis上-=temp
if(x1!=y1)
{
if(x1<y1)
step+=(y1-x1);
else
step-=(x1-y1);
}
}
if(x<0 && y<0) //第三象限
{
x1=-x,y1=-y;
temp=max(x1,y1);
temp=temp*2-1;
step=temp*temp; //找规律可得到step=(temp+temp-1)^2,实际上就是(x1+y1)^2
if(x1!=y1+1) //同理根据第三象限的基点进行处理
{
if(x1<(y1+1))
step-=(y1+1-x1);
else
step+=(x1-y1-1);
}
}
printf("%d",step);
return 0;
}