最大不覆盖点的圆

要求在画布上随机产生十万个点

找到最大的10个能不覆盖产生的点的圆

算法是没想 本来以为会有现成的 结果发现都是图论里的Orz

最终还是把附近点的距离算了遍Orz

再用随机的方法选可能的点排序

试验了几次 在1000x1000的画布上半径最多能到1.42左右

R作图什么的我才不知道呢


#coding:UTF-8

import random
import math
import numpy

dotcount=1000000  #取10000个数
axismax=1000     #坐标限定在[0,1000)
ranr=(dotcount/axismax**2)*2 #考虑附近的点的范围

dots={}
for i in range(dotcount):
   dots[random.random()*axismax]=random.random()*axismax
#取出横坐标排序,方便查找
dotx=dots.keys()
dotx.sort()

#以定的随机性得到点(x,y)满足的半径
def racr(x,y):
  #l为在所有点中横坐标与点相近的点的横坐标
  l=dotx[int((dotcount/axismax)*(x-ranr)):int((dotcount/axismax)*(x+ranr))]
  r=min([math.sqrt((dx-x)**2+(dots[dx]-y)**2) for dx in l])
  return (x,y,r)

#随机取2000个可能的圆心点 找到10个最大半径
#点在[ranr,axismax-rar]之间 过于靠边可能导致点距离计算错误
aty=[('x',float),('y',float),('r',float)]
dic=[racr(max(ranr,random.random()*axismax),min(axismax-ranr,\
     random.random()*axismax)) for i in range(200)]
ath=numpy.array(dic,dtype=aty)
resum=list(numpy.sort(ath,order=['r']))
#输出结果为(点横坐标,点纵坐标,半径)
print resum[-10:]



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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值