1237. 螺旋折线 Java题解 (数学,找规律)【第九届蓝桥杯省赛C++B组,JAVA B组】

该博客主要探讨了一个关于平面上的螺旋折线如何恰好经过所有整点的问题。作者指出由于数据规模较大,不适合枚举所有可能,而是需要寻找规律。通过将平面划分为四个部分,并分析每条线段上的端点,给出了求解该问题的算法。提供的Java代码实现了根据输入坐标计算螺旋折线的长度。解题思路涉及线段的划分、端点计算和线段偏移量的添加。
摘要由CSDN通过智能技术生成

如下图所示的螺旋折线经过平面上所有整点恰好一次。

 输入样例:

0 1

输出样例:

3

解题思路:

由于数据规模太大,不能枚举,所以需要找规律。

将平面上的点划分为四部分:从左上角顶点开始的线段,从右上角开始的线段,以及下边和左边的线段。可以先将每一圈的四个顶点螺旋折线长度表示出来,再加上线段距端点的偏移量得到最终距离。具体每个方向上直线的位置以及四个端点的表示在代码中体现。

Java代码:

import java.util.Scanner;

public class Main {
	public static void main(String[] args) {
		Scanner scan = new Scanner(System.in);
		int x = scan.nextInt();
		int y = scan.nextInt();
		scan.close();
		
		int n;//当前处于第几圈
		long ans = 0;
		if(Math.abs(x) <= y && y >= 0) {  //最上面一排(卡坐标在哪一条直线上)
			n = y;
			ans = (long)(2 * n) * (2 * n - 1) + x - (-n);  //端点的距离加上偏移量
		}else if(Math.abs(y) <= x && x >= 0) {  //右面
			n = x;
			ans = (long)(2 * n) * (2 * n) + n - y;
		}else if(Math.abs(x) <= Math.abs(y) + 1 && y <= 0) {  //下面
			n = -y;
			ans = (long)(2 * n) * (2 * n + 1) + n - x;
		}else {  //左面
			n = -x;
			ans = (long)(2 * n - 1) * (2 * n - 1) + y - (x + 1);
		}
		System.out.println(ans);
	}
}

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值