AcWing 1237 螺旋折线 脑筋急转弯 找规律 java
⭐ 螺旋直线


⭐ 思路:n 表示位于第几层上
① 找四点顶点的序号规律
② 找上下左右的边的规律
③ 找出坐标 与 层数 n 的关系,然后套公式求出起点
④ 起点 + 偏移量就是答案

😎 O(1)
import java.util.*;
public class Main
{
public static void main(String[] args)
{
Scanner sc = new Scanner(System.in);
long x = sc.nextLong();
long y = sc.nextLong();
if (Math.abs(x) <= y && y >= 0) // 上 (y >= 0)
{
long n = 2 * y * (2 * y - 1);// 起点 + 偏移量
System.out.println(n + x - (-y));
} else if (Math.abs(y) <= x && x >= 0) // 右(x 必须 >= 0)
{
long n = (2 * x) * (2 * x);// 起点
System.out.println(n + x - y);// 起点 + 偏移量
} else if (Math.abs(x) <= Math.abs(y) + 1 && y <= 0) // 下(y 必须 <= 0)
{
long n = Math.abs(2 * y) * (Math.abs(2 * y) + 1);
System.out.println(n + (-y) - x);
} else // 左
{
long n = (2 * Math.abs(x) - 1) * (2 * Math.abs(x) - 1);
System.out.println(n + y - (x + 1));
}
}
}
找规律可以发现每层的右上角点所需步数为为4 * k^2
① 求任意一个点的dis首先找到这个点所在的层数
②如果在该层的左或上则减去该点到右上角曼哈顿距离,
如果在该层的右或下则加上该点到右上角曼哈顿距离;
如果在该层的左或上则减去该点到右上角曼哈顿距离,
如果在该层的右或下则加上该点到右上角曼哈顿距离;
import java.util.Scanner;
public class Main
{
public static void main(String[] args)
{
Scanner sc = new Scanner(System.in);
long x = sc.nextLong();
long y = sc.nextLong();
long k = Math.max(Math.abs(x), Math.abs(y));// 取出所处的层数
if (x <= y)
System.out.println(4 * k * k - (k - x) - (k - y));
else
{
System.out.println(4 * k * k + (k - x) + (k - y));
}
}
}

浙公网安备 33010602011771号