美文网首页前端面试题
浇花问题的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