vc白萝卜 发表于 2020-5-14 15:46:28

最小圆覆盖

输入n个点的坐标,n<500, 求半径最小的圆能覆盖这n个点,在圆周上也算覆盖。
输出圆心坐标和半径的100倍的整数部分(不要四拾伍入)

输入格式
第一行一个整数n
接着n行,每行一个点的坐标,两个整数,中间一个空格
重复输入直至n=0

输出格式
每行一个结果,最小圆的X坐标的100倍整数部分、Y坐标的100倍整数部分、半径的100倍整数部分。
每行都有回车,n=0的除外

例子:
输入:
3
0 0
1 0
1 1
4
5 3
3 3
5 0
0 2
5
0 1
1 0
2 1
3 2
4 1
0

输出:
50 50 70
270 150 274
200 100 200
有大神会吗,这些语言都可以 C/C++DEV C++ python java c# 求救!!!

老八秘制 发表于 2020-5-14 15:48:46

@heidern0612
你希望得到问题解决的心情我们可以理解,但是你确实没必要重复发帖
导致不必要的问题,严重了就被封号
希望新手能看看版规

xiaosi4081 发表于 2020-5-14 15:48:59

你把你前两个发的删了,不然别人会扣你分

liuzhengyuan 发表于 2020-5-14 15:51:54

这些语言都可以 C/C++DEV C++ python java c#
难不成 DEV C++ 是一门语言?{:10_277:}

heidern0612 发表于 2020-5-14 16:10:17

老八秘制 发表于 2020-5-14 15:48
@heidern0612
你希望得到问题解决的心情我们可以理解,但是你确实没必要重复发帖
导致不必要的问题,严 ...

嗯,新人,大度一点吧。

sunrise085 发表于 2020-5-14 18:06:42

作为一个论坛提问,程序代码量挺大的
需要用到一定的算法
写了一下,但是没有写任何容错措施。运行时,一定要按照你所说的格式进行输入
import math
def get_center(point1,point2,point3):#求三点的外接圆的圆心坐标
    a = point2 - point1
    b = point2 - point1
    c = point3 - point2
    d = point3 - point2
    e = point2**2 + point2**2 - point1**2 - point1**2
    f = point3**2 + point3**2 - point2**2 - point2**2
    x = (f*b-e*d)/(c*b-a*d)/2;
    y = (a*f-e*c)/(a*d-b*c)/2;
    return (x,y)

def get_result(points):#求多点的最小覆盖圆的半径和圆心坐标
    center = points
    rad = 0
   
    def d(point1,point2):
      return math.sqrt((point1-point2)**2+(point1-point2)**2)
   
    for i in range(len(points)):
      if d(points,center)>rad:
            center = points
            rad = 0
            for j in range(i):
                if d(points,center)>rad:
                  center = ((points+points)/2,(points+points)/2)
                  rad = d(points,points)/2
                  for k in range(j):
                        if d(points,center)>rad:
                            center = get_center(points,points,points)
                            rad = d(points,center)
    return (center,rad)

result=[]
while True:#循环获取输入,并计算
    n = int(input("请输入坐标点数(输入0退出):"))
    if n == 0:
      break
    points = []
    des = []
    max_d = (0,0,0)
    for i in range(n):#输入n个坐标点
      x , y = (eval(k) for k in input("输入第%d个点的坐标"%(i+1)).split())
      points.append((x,y))
   
    center,rad=get_result(points)#计算n个点的最小覆盖圆
    result.append((int(center*100),int(center*100),int(rad*100)))#将结果扩大100倍并取整
for each in result:#循环输出结果
    print(each,each,each,sep=' ')
页: [1]
查看完整版本: 最小圆覆盖