Python-算法思维-4.2递归与分治2:平面最小点对

第1关:平面最小点对

本关任务:给定二维平面中n个点的坐标(整数),找出距离最近的2个坐标点之间的距离,n<=10000。

import math
n = eval(input())
A=[]
for i in range(n):
    x,y= map(int, input().split())
    A.append((x,y))

def Distance(a, b):
    return math.sqrt((a[0]-b[0])**2+(a[1]-b[1])**2)

#求[low..high]区间内的最小点距
def FidMin(A,low,high):
    ########## begin ##########
    # 请在此填写代码,返回区间[low,high]的最小点距
    m=10**10
    for i in range(n):
        a=A[i]
        for z in range(i+1,n):
            d=A[z]
            l=Distance(a, d)
            if l==0:
                continue
            elif l<m:
                m=l
    if m==10**10:
        return(0)
    else:
        return(m)
    ########## end ##########    
A.sort()
result=FidMin(A,0,len(A)-1)
print('%.3f' % result)

第2关:平面最小点对(两组坐标)

本关任务:给定二维平面中2n个点的坐标(整数),前n个点属于第一组,后n个点属于第二组,找出分别属于两个组,且距离最近的2个坐标点之间的距离,n<=10000。

import math
n = eval(input())
A=[]
for i in range(n*2):
    group = 1 if i<n else 2
    x,y= map(int, input().split())
    A.append((x,y,group))

def Distance(a, b):
    return math.sqrt((a[0]-b[0])**2+(a[1]-b[1])**2)

#求[low..high]区间内的最小点距
def FidMin(A,low,high):
    ########## begin ##########
    # 请在此填写代码,返回区间[low,high]的最小点距,且这两点属于不同的组
    m=1000000
    for i in range(low,high):
        if A[i][2]==1:
            for a in range(low,high):
                if A[a][2]==2:
                    d=Distance(A[i],A[a])
                    if d==0:
                        continue
                    elif d<m:
                        m=d
    if m==1000000:
        m=0
    return(m)
    ########## end ##########    
A.sort()
result=FidMin(A,0,len(A)-1)
print('%.3f' % result)

求求三连。。。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值