• HDU3694 Fermat Point in Quadrangle


      原题传送:http://acm.hdu.edu.cn/showproblem.php?pid=3694

      题意很简单,求平面四个点的费马点。

          这道题直接枚举所有情况:

      1.四个点独立不重叠,这种情况又分为两种情况:

        a.四个点构成凸四边形,那么对角线交点就是费马点

        b.四个点构成凹四边形,那么费马点肯定是凹的那个点 (因为漏了这个情况wa了10多次)

      2.四个点中有重复的点,费马点就是重复的那个点

    View Code
     1 #include <stdio.h>
     2 #include <string.h>
     3 #include <math.h>
     4 #include <stdlib.h>
     5 #define INF 10000000.0
     6 const double eps = 1e-6;
     7 
     8 struct point{double x, y;};
     9 
    10 inline double min(double a, double b){return a < b ? a : b;}
    11 
    12 inline double max(double a, double b){return a > b ? a : b;}
    13 
    14 bool inter(point a, point b, point c, point d)  // 判相交
    15 {
    16     if(min(a.x, b.x) > max(c.x, d.x) ||
    17        min(a.y, b.y) > max(c.y, d.y) ||
    18        min(c.x, d.x) > max(a.x, b.x) ||
    19        min(c.y, d.y) > max(a.y, b.y) )
    20         return 0;
    21         
    22     double h, i, j, k;
    23     h = (b.x - a.x) * (c.y - a.y) - (b.y - a.y) * (c.x - a.x);
    24     i = (b.x - a.x) * (d.y - a.y) - (b.y - a.y) * (d.x - a.x);
    25     j = (d.x - c.x) * (a.y - c.y) - (d.y - c.y) * (a.x - c.x);
    26     k = (d.x - c.x) * (b.y - c.y) - (d.y - c.y) * (b.x - c.x);
    27     return h * i <= eps && j * k <= eps;
    28 }
    29 
    30 double cal(point a, point b)      // 计算两点距离
    31 {
    32     return sqrt((a.x - b.x) * (a.x - b.x) + (a.y - b.y) * (a.y - b.y));
    33 }
    34 
    35 int main()
    36 {
    37     point a, b, c, d;
    38     double len[20];
    39     while(scanf("%lf%lf%lf%lf%lf%lf%lf%lf", &a.x, &a.y, &b.x, &b.y, &c.x, &c.y, &d.x, &d.y))
    40     {
    41         if(a.x == -1)
    42             break;
    43         for(int i = 1; i < 20; i ++)
    44             len[i] = INF;
    45 
    46         if(a.x == d.x && a.y == d.y)
    47             len[1] = cal(a, b) + cal(a, c); //a,d重合
    48         else if(a.x == c.x && a.y == c.y)
    49             len[2] = cal(a, b) + cal(a, d); //a,c重合
    50         else if(a.x == b.x && a.y == b.y)
    51             len[3] = cal(a, c) + cal(a, d); //a,b重合
    52         else if(b.x == c.x && b.y == c.y)
    53             len[4] = cal(b, a) + cal(b, d); //b,c重合
    54         else if(b.x == d.x && b.y == d.y)
    55             len[5] = cal(b, a) + cal(b, c); //b,d重合
    56         else if(c.x == b.x && c.y == b.y)
    57             len[6] = cal(c, a) + cal(c, b); //c,d重合
    58         else
    59         {
    60             if(inter(a, b, c, d))           //ab, cd相交
    61                 len[7] = cal(a, b) + cal(c, d); 
    62             else if(inter(a, c, b, d))      //ac, bd相交
    63                 len[8] = cal(a, c) + cal(b, d);
    64             else if(inter(a, d, b, c))      //ad, bc相交
    65                 len[9] = cal(a, d) + cal(b, c);
    66         }
    67         len[10] = cal(a, b) + cal(a, c) + cal(a, d); // 处理凹多边形
    68         len[11] = cal(b, a) + cal(b, c) + cal(b, d);
    69         len[12] = cal(c, a) + cal(c, b) + cal(c, d);
    70         len[13] = cal(d, a) + cal(d, b) + cal(d, c);
    71         double m = INF;
    72         for(int i = 1; i < 20; i ++)
    73             m = min(len[i], m);
    74         printf("%.4lf\n", m);
    75     }
    76     return 0;
    77 }
  • 相关阅读:
    git的撤销操作
    mysql的逻辑结构
    mysql的系列大纲
    CompletableFuture的介绍
    AQS学习
    mysql中的数据格式
    将excel的数据进行sql处理
    什么是数据分析
    找圆方法的总结和比较(三种主要识别方法的比较和融合)
    一个有趣问题的分析--寻找并且增强印章
  • 原文地址:https://www.cnblogs.com/huangfeihome/p/2682859.html
Copyright © 2020-2023  润新知