目录
思路:距离+圈数附加值
由图可知,每个点都可以看做在一个正方形上!
1.圈数:设为i;
圈数附加值:( i - 1)* 8;
2.辅助点,由图可知可设为(-i,-i);
3.距离:点(X,Y)到辅助点的间距 X - i + Y - i
所以:dis(X,Y)=( X - i + Y - i ) +( i - 1)*8;
4.特殊情况:
- 原点 X==Y&&X=0 return 0 ;
- 辅助点 X==Y&&X<0 return (1+2+...+i)*8 ;
代码:
仅参考,按着第一遍思路直接打的,写的很迂回
import java.util.Scanner;
/**
* 螺旋折线
*/
public class No7_SpiralLines {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
long x=sc.nextLong();
long y=sc.nextLong();
long a=0,b=0;
//求所在正方形的辅助点,将每个正方形的左下这个点作为辅助点
//辅助点的坐标绝对是两个负数,同时辅助点也可以反映圈数
if(x>0) {a=-x;}else{a=x;}
if(y>0) {b=-y;}else{b=y;}
long min=Math.min(a, b);//辅助点(min,min)
由图可知,x,y中绝对值大的数表示在第几个正方形
long n=(-min-1)*8;//(圈值-1)*8,得到所在圈数的附加值
long m=x+y-2*min+n;//距离=x到a的值+y到b的值+附加值
//辅助点
if (x==y&&x<0) {
m=0;
long o=-min;//圈数
for (int i = 0; i < o; i++) {
m+=8*(i+1);//每经过一圈加一个附加值
}
}
if(x==y&&x==0) m=0;
System.out.println(m);
}
}