美文网首页前端面试题
浇花问题的js实现

浇花问题的js实现

作者: 千茉紫依 | 来源:发表于2019-05-01 13:44 被阅读0次

    链接:百度2019前端笔试编程题 来源:牛客网

    一个花坛中有很多花和两个喷泉。

    喷泉可以浇到以自己为中心,半径为r的圆内的所有范围的花。

    现在给出这些花的坐标和两个喷泉的坐标,要求你安排两个喷泉浇花的半径r1和r2

    使得所有的花都能被浇到的同时, r12 + r22 的值最小。

    输入描述:

    第一行5个整数n,x1,y1,x2,y2表示花的数量和两个喷泉的坐标。
    接下来n行,每行两个整数xi, yi表示第i朵花的坐标。
    满足1 <= n <= 2000,花和喷泉的坐标满足-107<= x, y <= 107

    输出描述:

    一个整数,r12 + r22 的最小值。

    示例1

    输入

    2 -1 0 5 3
    0 2
    5 2

    输出
    6

    我的思路:利用闭包返回f函数,用来收集每次传入的花朵坐标,当花朵坐标数量为n时,开始计算,对于花朵i,分别计算出它距离两个喷泉的距离r1和r2,两者中取距离最小值保存,相当于由该喷泉负责花朵i,在存储时取该喷泉距离序列中最大值予以保存,这样可以保证喷到最多的花,最后将所有的花朵遍历完成后,返回minR2+minR1即为题目要求的最小值。

         function w(n,x1,y1,x2,y2){
                let flowers=[]
                let r=0,minR2=0,minR1=0
                function f(xi, yi){
                    flowers.push([xi, yi])
                    if(flowers.length==n){
                        for(let flower of flowers){
                            let r1=(x1-flower[0])*(x1-flower[0])+(y1-flower[1])*(y1-flower[1])
                            let r2=(x2-flower[0])*(x2-flower[0])+(y2-flower[1])*(y2-flower[1])
                            if(r1>r2){
                                minR2= Math.max(r2,minR2)
                            }else{
                                minR1=Math.max(r1,minR1)
                            }
                        }
                        console.log(minR2+minR1);
                        return minR2+minR1
                    }else{
                        return f
                    }
                }
                return f
            }
    

    相关文章

      网友评论

        本文标题:浇花问题的js实现

        本文链接:https://www.haomeiwen.com/subject/quoinqtx.html