2018年 蓝桥杯 java 螺旋折线
题目网上很多,这里就不过多论述了
不清楚的可以去 https://blog.****.net/qq_34202873/article/details/79784728 查看~~
思路:把折叠曲线看成一圈一圈的,然后在找到外圈计算最外圈路径长度,最后加上内圈总路径长度
public class MAIN {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int x = sc.nextInt();
int y = sc.nextInt();
System.out.println(dis(x, y));
}
private static BigInteger dis(int x, int y) {// 使用BigInteger-->避免大数相乘产生溢出情况
int n = max(x, y);// 找到最外圈是第几圈
int k = n - 1;// k表示内圈总数
int lost = g(x, y, n);// 计算外圈路径长度
BigInteger most1 = new BigInteger(Integer.toString(8 + k * 8));
BigInteger most2 = new BigInteger(Integer.toString(k / 2));
/**
* most = most1*most2
* most = (8+k*8)*k/2 --->内圈总数是一个数列求和:1 8 16 24
*/
BigInteger l = new BigInteger(Integer.toString(lost));
return l.add((most1.multiply(most2)));
}
private static int g(int x, int y, int n) {
/**
* 分成两大部分计算:
* 1.表示顶点处
* 2.表示每个边的情况
* */
if (Math.abs(x) == Math.abs(y)) {
if (x < 0 && y > 0)
return 2 * n;
else if (x > 0 && y > 0)
return 4 * n;
else if (x > 0 && y < 0)
return 6 * n;
else
return x == 0 ? 0 : 8 * n;
} else {
if (x == -n)
return n + y;
else if (x == n)
return 4 * n + n - y;
else if (y == n)
return 2 * n + n + x;
else
return 6 * 2 + n - x;
}
}
private static int max(int x, int y) {
//求最外边的圈数
if (Math.abs(x) >= Math.abs(y))
return Math.abs(x);
else
return Math.abs(y);
}