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

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

 输入样例:

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

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值