题目:平面上给定n条线段,找出一个点,使这个点到这n条线段的距离和最小。

源码如下:

 1 #include <iostream>
 2 #include <string.h>
 3 #include <stdlib.h>
 4 #include <stdio.h>
 5 #include <time.h>
 6 #include <math.h>
 7
 8 #define N 1005
 9 #define eps 1e-8     //搜索停止条件阀值
10 #define INF 1e99
11 #define delta 0.98   //温度下降速度
12 #define T 100        //初始温度
13
14 using namespace std;
15
16 int dx[4] = {0, 0, -1, 1};
17 int dy[4] = {-1, 1, 0, 0};  //上下左右四个方向
18
19 struct Point
20 {
21     double x, y;
22 };
23
24 Point s[N], t[N];
25
26 double cross(Point A, Point B, Point C)
27 {
28     return (B.x - A.x) * (C.y - A.y) - (B.y - A.y) * (C.x - A.x);
29 }
30
31 double multi(Point A, Point B, Point C)
32 {
33     return (B.x - A.x) * (C.x - A.x) + (B.y - A.y) * (C.y - A.y);
34 }
35
36 double dist(Point A, Point B)
37 {
38     return sqrt((A.x - B.x) * (A.x - B.x) + (A.y - B.y) * (A.y - B.y));
39 }
40
41 double GetDist(Point A, Point B, Point C)
42 {
43     if(dist(A, B) < eps) return dist(B, C);
44     if(multi(A, B, C) < -eps) return dist(A, C);
45     if(multi(B, A, C) < -eps) return dist(B, C);
46     return fabs(cross(A, B, C) / dist(A, B));
47 }
48
49 double GetSum(Point s[], Point t[], int n, Point o)
50 {
51     double ans = 0;
52     while(n--)
53         ans += GetDist(s[n], t[n], o);
54     return ans;
55 }
56
57 double Search(Point s[], Point t[], int n, Point &o)
58 {
59     o = s[0];
60     double tem = T;
61     double ans = INF;
62     while(tem > eps)
63     {
64         bool flag = 1;
65         while(flag)
66         {
67             flag = 0;
68             for(int i = 0; i < 4; i++)    //上下左右四个方向
69             {
70                 Point z;
71                 z.x = o.x + dx[i] * tem;
72                 z.y = o.y + dy[i] * tem;
73                 double tp = GetSum(s, t, n, z);
74                 if(ans > tp)
75                 {
76                     ans = tp;
77                     o = z;
78                     flag = 1;
79                 }
80             }
81         }
82         tem *= delta;
83     }
84     return ans;
85 }
86
87 int main()
88 {
89     int n;
90     while(scanf("%d", &n) != EOF)
91     {
92         for(int i = 0; i < n; i++)
93             scanf("%lf %lf %lf %lf", &s[i].x, &s[i].y, &t[i].x, &t[i].y);
94         Point o;
95         double ans = Search(s, t, n, o);
96         printf("%.1lf %.1lf %.1lf\n", o.x, o.y, ans);
97     }
98     return 0;
99 }  

您可以考虑给博主来个小小的打赏以资鼓励,您的肯定将是我最大的动力。thx.

微信打赏

支付宝打赏

作  者: Angel_Kitty
出  处:http://www.cnblogs.com/ECJTUACM-873284962/
关于作者:潜心机器学习以及信息安全的综合研究。如有问题或建议,请多多赐教!
版权声明:本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接。
特此声明:所有评论和私信都会在第一时间回复。也欢迎园子的大大们指正错误,共同进步。或者直接私信我
声援博主:如果您觉得文章对您有帮助,可以点击右下角【推荐】推荐一下该博文。您的鼓励是作者坚持原创和持续写作的最大动力!

平面上给定n条线段,找出一个点,使这个点到这n条线段的距离和最小。相关推荐

  1. c语言给定整数求紧随素数,C语言:找出一个大于给定整数m且紧随m的素数,-求出能整除x且不是偶数的数的个数,...

    //函数fun功能:找出一个大于给定整数m且紧随m的素数,并作为函数值返回. #include #include #include int fun( int m) { int i,k; for (i= ...

  2. 给定一个最多包含40亿个随机排列的32位整数的顺序文件,找出一个不在文件中的32位整数

    给定一个最多包含40亿个随机排列的32位整数的顺序文件,找出一个不在文件中的32位整数.            1.在文件中至少存在这样一个数?            2.如果有足够的内存,如何处理? ...

  3. 快速找出一个数组中的两个数字,让这两个数字之和等于一个给定的值

    我觉得写得很清晰,希望没有侵犯作者的著作权,原文地址http://blog.csdn.net/hackbuteer1/article/details/6699642 快速找出一个数组中的两个数字,让这 ...

  4. C语言编程>第二十二周 ① 下列给定程序中,函数fun的功能是:找出一个大于给定整数n且紧随n的素数,并作为函数值返回。

    例题:下列给定程序中,函数fun的功能是:找出一个大于给定整数n且紧随n的素数,并作为函数值返回. 例如,输入 整数为32,则输出的数素数为37". 注意:不要改动main函数,不能增行或删 ...

  5. 找出一个二维数组中的鞍点,即该位置上的元素在该行最大,在该列最小,也可能没有靶点

    找出一个二维师数组中的鞍点,即该位置上的元素在该行最大,在该列最小,也可能没有靶点 思路: 找出某行最大数,再判断此数是否是所在列最小 代码: #include<stdio.h> int ...

  6. (C语言)找出一个二维数组中的鞍点,即该位置上的元素在该行最大,在该列上最小,也可能没有鞍点。存在则输出坐标;否则输出 -1.

    #include<stdio.h> /* 找出一个二维数组中的鞍点,即该位置上的元素在该行最大, 在该列上最小,也可能没有鞍点.存在则输出坐标:否则输出 -1. */ int main(v ...

  7. 习题 5.7 找出一个二维数组中的鞍点,即该位置上的元素在该行上最大,在该列上最小(也可能没有鞍点)。

    C++程序设计(第三版) 谭浩强 习题5.7 个人设计 习题 5.7 找出一个二维数组中的鞍点,即该位置上的元素在该行上最大,在该列上最小(也可能没有鞍点). 代码块: #include <io ...

  8. c语言 找出一个大于给定整数且紧随这个整数的素数

    找出一个大于给定整数且紧随这个整数的素数 问题:1.忘了break 2.忘了第一个return 0,其后果就是咔------根本停不下来(语言难以描述) 3.for+if的穷举法(?)用来判断是不是素 ...

  9. 编写程序:找出一个大于给定整数且紧随这个整数的素数,并作为函数值返回。

    编写程序:找出一个大于给定整数且紧随这个整数的素数,并作为函数值返回. 下面展示一些 内联代码片. #include<stdio.h> int main() {int f(int s);i ...

最新文章

  1. JAVA实现中点画线_实验1-中点画线和Bresenham画线算法的实现
  2. Swarm 如何存储数据?- 每天5分钟玩转 Docker 容器技术(103)
  3. OnClick,OnClientClick和OnServerClick的区别
  4. c语言 函数的参数传递示例_restder()函数,带有C ++中的示例
  5. java tomcat 日志_java – 访问Tomcat中的详细日志
  6. linux qt 触摸屏事件,利用触摸屏获取事件坐标
  7. python + selenium + Chromedriver 的浏览器爬虫出现的一些问题的汇总
  8. GD32F103VET6替代STM32F103VET6遇到的问题
  9. 搭建内网文件共享服务器,如何搭建共享服务器实现办公室文件共享?
  10. AMBA_AXI总线详解
  11. Java 识别读取pdf中的二维码信息
  12. IDEA 2019 修改中文字体
  13. matlab怎么栅格化地图,用栅格化的思维进行地图散点数据绘制
  14. android email分析,QQ邮箱Android客户端产品体验报告
  15. 个税局端服务器处理结果查询不到三方协议,「实用」电子税务局中三方协议验证失败如何处理?来看攻略啦!...
  16. 苹果系统虚拟计算机win7,Mac虚拟机安装Win7 64位系统教程_苹果虚拟机安装Win7真的很简单...
  17. git missing change-id解决办法
  18. html光标定位到文本框,js获取光标位置和设置文本框光标位置示例代码
  19. 校内练习 华山论剑 [最短路]
  20. 计算机软考程序员客观题,软考程序员2000年到2018年真题试卷(有答案)

热门文章

  1. matepad什么时候升级鸿蒙,华为MatePad Pro迎来EMUI 11正式版升级 后续可直接升级鸿蒙系统...
  2. petalinux 下使用 xsa 查看所有的 Zynq Reg 设置
  3. 为什么有TCP 的三次握手 和 四次挥手
  4. 怎么用计算机实现矩阵摹乘法,基于距离矩阵摹乘法的生鲜产品配送路径优化
  5. springweb 导入导出csv_诺基亚Nokia8110通讯录如何导入?这里有妙招
  6. 开源 软件测试自动化工具,开源Web自动化测试工具Selenium IDE
  7. FPGA之道(21)HDL语言的选择
  8. 【 MATLAB 】MATLAB 实现模拟信号采样后的重建(三)应用三次样条函数spline实现内插
  9. 【 FPGA 】FIR 滤波器之多相抽取器(Polyphase Decimator)
  10. 信道编码之差错控制方式