蓝桥杯-螺旋折线(java)

题目描述
如图p1.pgn所示的螺旋折线经过平面上所有整点恰好一次。
对于整点(X, Y),我们定义它到原点的距离dis(X, Y)是从原点到(X, Y)的螺旋折线段的长度。

 

我的思路也是参考了网上一位博主的思想,但是后面的方法更容易理解。

原博客链接:第九届蓝桥杯 螺旋折线 省赛JAVA/C/C++/ B组_zmjのblog-CSDN博客

同样,开始将最左边的那根横线按图中蓝色箭头顺时针旋转90度,则内部可以构成正方形,则内部长度便好计算了。再计算外面的一层的折线长度,两者相加即为总长度。接下里详细分析步骤:

1、Math.max(Math.abs(x),Math.abs(y))得到的是内部正方形+1,即为count

2、计算内部正方形的折线长度,利用for循环计算即可,每一层的正方形周长为i*2*count

3、计算外部折线长度,我们将其分为图示绿点所在的四边,同时以最左下角的点为起点开始计算,首先从左边开始考虑,每一种情况怎么计算我们将图上绿点作为一种情况带入想象即可。

4、特殊情况,在原点的时候就直接返回0即可。

package LanQiao.LanQiao.Test2018;
/**
 * 螺旋折线
 * @author wanhailin
 * @creat 2022-03-06-21:08
 */
public class Test7 {
    public static int dis(int x, int y) {
        int distance = 0;//总距离
        if (x == 0 && y == 0) distance = 0;//原点
        int count = Math.max(Math.abs(x), Math.abs(y));//取了x,y绝对值较大的一个,得到内层正方形数
        int in_distance = square_distance(count);//内圈长度
        //将最外层的分成四面来做
        int out_distance = 0;//最外圈的长度
        //左边
        if (x == -count) {
            out_distance = Math.abs(y) + 2;
        }
        //上面
        if (y == count) {
            out_distance = 2 * count + (x - (-count));
        }
        //右边
        if (x == count) {
            out_distance = 4 * count + (count - y);
        }
        //下边
        if (y == -count) {
            out_distance = 3 * count + (count - x);
        }
        distance = in_distance + out_distance;//总长度为内外圈长度相加
        return distance;
    }

    //计算内部正方形边长的函数
    public static int square_distance(int count) {
        int square_distance = 0;
        for (int i = 1; i < count; i++) {
            square_distance += i * 2 * 4;
        }
        return square_distance;
    }

    public static void main(String[] args) {
        System.out.println(dis(4, 1));
    }
}

如有错误欢迎评论区指正,也欢迎大家评论区交流。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值