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));
		}
	}
}

posted @ 2023-03-29 15:00  兑生  阅读(25)  评论(0)    收藏  举报  来源
Live2D