zoukankan      html  css  js  c++  java
  • HDU3272 Mission Impossible

    三点构成三个点对的路径,x轴、y轴都至少有一个点对的路径经过。

    枚举每组点对的路径让其经过一个轴,当然也可以同时经过两个轴。在所有情况中取最小答案。

    当坐标在轴同一侧时,对其中一个点的该坐标取反,得到的新点求距离就是镜面反射的距离。

    如果在不同侧,就直接求距离。

     1 #include<stdio.h>
     2 #include<stdlib.h>
     3 #include<math.h>
     4 #include<algorithm>
     5 const double eps = 1e-8;
     6 inline double Sqr(double x) {return x * x;}
     7 struct Point
     8 {
     9     double x, y;
    10     double Dis(const Point &b)const{return sqrt(Sqr(x - b.x) + Sqr(y - b.y));}
    11 };
    12 Point p[4], lin;
    13 double CalDis(int i, bool nx, bool ny)
    14 {
    15     Point lin = p[i];
    16     if(nx && p[i].x * p[i + 1].x > -eps) lin.x = -lin.x;
    17     if(ny && p[i].y * p[i + 1].y > -eps) lin.y = -lin.y;
    18     return lin.Dis(p[i + 1]);
    19 }
    20 int main()
    21 {
    22     int t, i, j;
    23     double dis, ans;
    24     for(scanf("%d", &t); t --; )
    25     {
    26         for(i = 0; i < 3; i ++) scanf("%lf%lf", &p[i].x, &p[i].y);
    27         p[3] = p[0], ans = 1e30;
    28         for(i = 0; i < 3; i ++) for(j = 0; j < 3; j ++)
    29         {
    30             dis = 0;
    31             if(i == j) dis = CalDis(i, true, true) + p[i + 1].Dis(p[(i + 2) % 3]) + p[i].Dis(p[(i + 2) % 3]);
    32             else dis = CalDis(i, true, false) + CalDis(j, false, true) + p[3 - i - j].Dis(p[4 - i - j]);
    33             ans = std::min(ans, dis);
    34         }
    35         printf("%.2f\n", ans);
    36     }
    37     return 0;
    38 }
  • 相关阅读:
    关于泛型
    共享几个.net工具类
    关于Guid
    自动更新解决方案
    订阅者模式实例
    好久没有blog了,今日就share一个update program的经验
    杀掉相应数据库的进程
    解决IFrame下无法写Cookie问题
    sql处理死锁
    log4net配置及使用方法
  • 原文地址:https://www.cnblogs.com/CSGrandeur/p/2741873.html
Copyright © 2011-2022 走看看