鱼C论坛

 找回密码
 立即注册
查看: 2040|回复: 5

最小圆覆盖

[复制链接]
发表于 2020-5-14 15:46:28 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
输入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# 求救!!!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-5-14 15:48:46 | 显示全部楼层
@heidern0612
你希望得到问题解决的心情我们可以理解,但是你确实没必要重复发帖
导致不必要的问题,严重了就被封号
希望新手能看看版规
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-5-14 15:48:59 | 显示全部楼层
你把你前两个发的删了,不然别人会扣你分
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-5-14 15:51:54 | 显示全部楼层
这些语言都可以 C/C++  DEV C++ python java c#

难不成 DEV C++ 是一门语言?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

嗯,新人,大度一点吧。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-5-14 18:06:42 | 显示全部楼层
作为一个论坛提问,程序代码量挺大的
需要用到一定的算法
写了一下,但是没有写任何容错措施。运行时,一定要按照你所说的格式进行输入
import math
def get_center(point1,point2,point3):#求三点的外接圆的圆心坐标
    a = point2[0] - point1[0]
    b = point2[1] - point1[1]
    c = point3[0] - point2[0]
    d = point3[1] - point2[1]
    e = point2[0]**2 + point2[1]**2 - point1[0]**2 - point1[1]**2
    f = point3[0]**2 + point3[1]**2 - point2[0]**2 - point2[1]**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[0]
    rad = 0
    
    def d(point1,point2):
        return math.sqrt((point1[0]-point2[0])**2+(point1[1]-point2[1])**2)
    
    for i in range(len(points)):
        if d(points[i],center)>rad:
            center = points[i]
            rad = 0
            for j in range(i):
                if d(points[j],center)>rad:
                    center = ((points[i][0]+points[j][0])/2,(points[i][1]+points[j][1])/2)
                    rad = d(points[i],points[j])/2
                    for k in range(j):
                        if d(points[k],center)>rad:
                            center = get_center(points[i],points[j],points[k])
                            rad = d(points[i],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[0]*100),int(center[1]*100),int(rad*100)))#将结果扩大100倍并取整
for each in result:#循环输出结果
    print(each[0],each[1],each[2],sep=' ')
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-1-11 19:56

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表