ZOJ1450 Minimal Circle 最小圆覆盖

包含点集所有点的最小圆的算法
 http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=450
平面上有n个点,给定n个点的坐标,试找一个半径最小的圆,将n
个点全部包围,点可以在圆上。

1. 在点集中任取3点A,B,C。
2. 作一个包含A,B,C三点的最小圆,圆周可能通过这3点,也可能只通过
其中两点,但包含第3点.后一种情况圆周上的两点一定是位于圆的一条直
径的两端。
3. 在点集中找出距离第2步所建圆圆心最远的D点,若D点已在圆内或圆周上,
则该圆即为所求的圆,算法结束.则,执行第4步。
4. 在A,B,C,D中选3个点,使由它们生成的一个包含这4个点的圆为最小,这3
点成为新的A,B,C,返回执行第2步。若在第4步生成的圆的圆周只通过A,B,C,D
中的两点,则圆周上的两点取成新的A和B,从另两点中任取一点作为新的C。

 

程序设计题解上的解题报告:
对于一个给定的点集A,记MinCircle(A)为点集A的最小外接圆,显然,对于所
有的点集情况A,MinCircle(A)都是存在且惟一的。需要特别说明的是,当A为空
集时,MinCircle(A)为空集,当A={a}时,MinCircle(A)圆心坐标为a,半径为0;
   显然,MinCircle(A)可以有A边界上最多三个点确定(当点集A中点的个数大于
1时,有可能两个点确定了MinCircle(A)),也就是说存在着一个点集B,|B|<=3
且B包含与A,有MinCircle(B)=MinCircle(A).所以,如果a不属于B,则
MinCircle(A-{a})=MinCircle(A);如果MinCircle(A-{a})不等于MinCircle(A),则
a属于B。
    所以我们可以从一个空集R开始,不断的把题目中给定的点集中的点加入R,同
时维护R的外接圆最小,这样就可以得到解决该题的算法。

代码#include <stdio.h>
#include <math.h>
const int maxn = 1005;
const double eps = 1e-6;
struct TPoint {double x, y;TPoint operator-(TPoint & a) {TPoint p1;p1.x = x - a.x;p1.y = y - a.y;return p1;}
};
struct TCircle {double r;TPoint centre;
};
struct TTriangle {TPoint t[3];
};
TCircle c;
TPoint a[maxn];
double distance(TPoint p1, TPoint p2) {TPoint p3;p3.x = p2.x - p1.x;p3.y = p2.y - p1.y;return sqrt(p3.x * p3.x + p3.y * p3.y);
}
double triangleArea(TTriangle t) {TPoint p1, p2;p1 = t.t[1] - t.t[0];p2 = t.t[2] - t.t[0];return fabs(p1.x * p2.y - p1.y * p2.x) / 2;
}
TCircle circumcircleOfTriangle(TTriangle t) {//三角形的外接圆TCircle tmp;double a, b, c, c1, c2;double xA, yA, xB, yB, xC, yC;a = distance(t.t[0], t.t[1]);b = distance(t.t[1], t.t[2]);c = distance(t.t[2], t.t[0]);//根据S = a * b * c / R / 4;求半径Rtmp.r = a * b * c / triangleArea(t) / 4;xA = t.t[0].x;yA = t.t[0].y;xB = t.t[1].x;yB = t.t[1].y;xC = t.t[2].x;yC = t.t[2].y;c1 = (xA * xA + yA * yA - xB * xB - yB * yB) / 2;c2 = (xA * xA + yA * yA - xC * xC - yC * yC) / 2;tmp.centre.x = (c1 * (yA - yC) - c2 * (yA - yB)) /((xA - xB) * (yA - yC) - (xA - xC) * (yA - yB));tmp.centre.y = (c1 * (xA - xC) - c2 * (xA - xB)) /((yA - yB) * (xA - xC) - (yA - yC) * (xA - xB));return tmp;
}TCircle MinCircle2(int tce, TTriangle ce) {TCircle tmp;if (tce == 0) tmp.r = -2;else if (tce == 1) {tmp.centre = ce.t[0];tmp.r = 0;} else if (tce == 2) {tmp.r = distance(ce.t[0], ce.t[1]) / 2;tmp.centre.x = (ce.t[0].x + ce.t[1].x) / 2;tmp.centre.y = (ce.t[0].y + ce.t[1].y) / 2;} else if (tce == 3) tmp = circumcircleOfTriangle(ce);return tmp;
}void MinCircle(int t, int tce, TTriangle ce) {int i, j;TPoint tmp;c = MinCircle2(tce, ce);if (tce == 3) return;for (i = 1; i <= t; i++) {if (distance(a[i], c.centre) > c.r) {ce.t[tce] = a[i];MinCircle(i - 1, tce + 1, ce);tmp = a[i];for (j = i; j >= 2; j--) {a[j] = a[j - 1];}a[1] = tmp;}}
}int main() {//freopen("circle.in", "r", stdin);//freopen("out.txt", "w", stdout);int n,i;while (scanf("%d", &n) != EOF && n) {for (i = 1; i <= n; i++)scanf("%lf%lf", &a[i].x, &a[i].y);TTriangle ce;MinCircle(n, 0, ce);printf("%.2lf %.2lf %.2lf\n", c.centre.x, c.centre.y, c.r);}return 0;
}


附上几组测试数据

 

代码
2 2
1 1
2
3
0 0
0
1
1
1 0
0
1
2
2
1
1
1
0 0
0
0
0
0
1
1
1
1
1
2
2
2
2
2
3
3
3
3
3
4
4
4
4
4
0 0
0
1
2
3
4
5
6
7
8
1
2
1
2
3
1
4
4
4
4
1
5
5
5
1
6
6
8
8
8
6
7
3
4
7
5
0 0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
0 0
1
2
3
4
5
6
7
8
9
1
2
3
4
5
6
7
8
2
3
4
5
6
7
3
4
5
6
4
5
0 0
1
2
3
0
1
2
3
0
1
2
3
4
0
0
0 3
2
1
0
1
2
3
2
1
0
1
2
3


 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/353247.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

遗传算法各Matlab工具箱简介

关于matlab遗传算法工具箱主要有三种&#xff1a;1、gaot工具箱&#xff1a;这是网上流传的免费的工具箱&#xff0c;网上对它介绍的资料也挺多&#xff0c;它不是Matlab软件自带的&#xff0c;但可以自己配置使用。飞思科技产品研发中心编著《Matlab 6.X辅助优化计算与设计》第…

独眼巨人反应组织了Java 8库的寒武纪爆发

什么是独眼巨人反应&#xff1f; Lambda表达式和默认方法在Java 8中的出现预示了Java语言十年来最大的结构性变化。 在此基础上构建了一些新的很酷的API&#xff0c;例如Stream, Optional, CompletableFuture最终Java开发人员可以以更实用的样式进行编码。 尽管这是非常受欢迎的…

C语言中文件定位函数总结

C语言中文件定位函数主要是&#xff1a;fseek, ftell, fsetpos, fgetpos。 先来讲前两个函数&#xff0c;这是最基本的定位函数&#xff1a; fseek函数&#xff1a;能把文件指针移动到文件任何位置&#xff0c;其原型是&#xff1a;int fseek(FILE *fp, long offset, int fromw…

API

api 百科名片 API&#xff08;Application Programming Interface,应用程序编程接口&#xff09;是一些预先定义的函数&#xff0c;目的是提供应用程序与开发人员基于某软件或硬件的以访问一组例程的能力&#xff0c;而又无需访问源码&#xff0c;或理解内部工作机制的细节。目…

Matlab gatool使用方法

可以通过输入gatool或者optimtool(ga)打开图形界面或者用ga()运行命令行函数设置Fitnessfunction 和对应的Number of variables,为了提高效率最好向量化适应度函数,然后设置Vectorize参数为On可以选择相应参数进行设置Population种群参数Fitness scalling适应度比例参数Selecti…

系统模块 OS

os.system("系统命令") 调用系统命令 os.system("task kill /f /im 系统的进程") 关闭系统进程 os.listdir(地址) 扫描目录里面的文件。默认的是当前文件夹 返回一个列表 import os # os.listdir(地址) 扫描目录里面的文件。默认的是当前文件夹 print(os.…

Matlab非线性拟合工具箱cftool

一、 单一变量的曲线逼近 Matlab有一个功能强大的曲线拟合工具箱 cftool &#xff0c;使用方便&#xff0c;能实现多种类型的线性、非线性曲线拟合。下面结合我使用的 Matlab R2007b 来简单介绍如何使用这个工具箱。 假设我们要拟合的函数形式是 yA*x*x B*x, 且A>0,B>0…

jsf标签p:ajax_JSF简单Ajax示例

jsf标签<p:ajax>今天&#xff0c;我们将看到一些使用JSF的Ajax简单样本。 如果要查看有关JSF / Web应用程序的其他文章&#xff0c;请单击以下链接&#xff1a; 重定向后的JSF持久化对象和消息 &#xff0c; 使用JAAS和JSF进行用户登录验证 &#xff0c; JSF&#xff1a;…

C#中数据库事务、存储过程基本用法

SQL 事务 public bool UpdateQsRegisterSql(List<string> ids, int newQueueId, string newQueueName){using (SqlConnection con new SqlConnection(DBHelper.Instance.ConStr)){SqlTransaction tran null;try{con.Open();SqlCommand cmd con.CreateCommand();tran …

第一章 初识Mathematica

第一章 初识Mathematica 1&#xff0e;Mathematica是什么 Matematica是由美国Wolfram公司研究开发的一个著名的数学软件&#xff0c;它提供了非常强大的功能&#xff0c;能够完成符号运算、数学图形的绘制、甚至动画制作等多种操作。Matematica的基本系统主要是用C语言开发的&…

matlab中统计工具箱函数名大全

MATLAB统计工具箱包括概率分布、方差分析、假设检验、分布检验、非参数检验、回归分析、判别分析、主成分分析、因子分析、系统聚类分析、K均值聚类分析、试验设计、决策树、多元方差分析、统计过程控制和统计图形绘制等。优化工具箱包括无约束最优化、有约束最优化、二次规划、…

BIOS维修技术

BIOS是电脑中最基础且最重要的程序&#xff0c;为电脑提供最低级且最直接的硬件控制&#xff0c;电脑的原始操作都是依照固化在BIOS里的程序来完成的。因此如果BIOS出现故障将会导致影响电脑的正常工作。BIOS故障有很多&#xff0c;根据常见的BIOS故障现象及其产生的原因&#…

使用Java Servlet,JSP标签和Stormpath快速构建Java Web App

建筑物身份管理&#xff0c;包括身份验证和授权&#xff1f; 尝试Stormpath&#xff01; 我们的REST API和强大的Java SDK支持可以消除您的安全风险&#xff0c;并且可以在几分钟内实现。 注册 &#xff0c;再也不会建立auth了&#xff01; 我们刚刚发布了Java SDK的主要升级版…

Matlab optimtool优化(Optimization)工具箱

1 工具箱概述1.1 功能&#xff08;1&#xff09;求解无约束条件非线性极小值&#xff1b;&#xff08;2&#xff09;求解约束条件下非线性极小值&#xff0c;包括目标逼近问题、极大-极小值问题和半无限极小值问题&#xff1b;&#xff08;3&#xff09;求解二次规划和线性规划…

Python目录链接

第1章  就这么愉快的开始吧 课时1&#xff1a;我和python的第一次亲密接触 一、Python3的下载与安装 二、从IDIE启动Python 三、尝试点新的东西 四、为什么会这样&#xff1f; 五、课时01课后习题及答案 第2章  用Python设计一个游戏 课时2&#xff1a;用python设计第一个…

谚语幸运的开始

谚语:幸运的开始 今天收到一个朋友的邮件&#xff0c;打开一看&#xff0c;是幸运谚语&#xff0c;自以为谚语写的非常好&#xff0c;所以转写出来与朋友们分享&#xff01;希望你能得到幸运哦&#xff01;荷兰的谚语幸运谚语幸运的开始关于金钱&#xff1a;你有了钱&#xff…

VS高版本编写C程序的C4996错误

最简单的可以用的方法:选项Project | Configuration Properties | C/C | Preprocessor | Preprocessor Definitions 添加_CRT_SECURE_NO_DEPRECATE和_SCL_SECURE_NO_DEPRECATE

apache camel_什么时候使用Apache Camel?

apache camelApache Camel是JVM / Java环境中我最喜欢的开源框架之一。 它可以轻松集成使用多种协议和技术的不同应用程序。 本文介绍了何时使用Apache Camel以及何时使用其他替代方法。 问题&#xff1a;企业应用程序集成&#xff08;EAI&#xff09; 由于新产品和新应用&…

Windows、Linux和MAC的CR, LF, CR/LF换行符

在文本处理中, CR, LF, CR/LF是不同操作系统上使用的换行符. Dos和windows&#xff1a; 采用回车换行CR/LF表示下一行. UNIX/Linux &#xff1a; 采用换行符LF表示下一行. MAC OS &#xff1a; 采用回车符CR表示下一行. CR用符号\r表示, 十进制ASCII代码是13, 十六进制代…

GitHub多人协作简明教程

本文面向已经了解/熟悉git基本命令但是并不熟悉如何使用GitHub进行多人协作开发项目的同学。 为了简单起见&#xff0c;这里假设只有两个开发人员&#xff0c;HuanianLi 和 DaxiangLi。他们在GitHub上的地址和角色为&#xff1a; HuanianLi: https://github.com/huanianli # M…