第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)
求求三连。。。