hdu 3272 Mission Impossible

Mission Impossible

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 414    Accepted Submission(s): 178


Problem Description
There are A, B, C, D four kinds of resources, A can be obtained at any point in the X-axis. B can be obtained at any point in the Y-axis. C and D each will only be able to achieve at a certain point. Giving the coordinates of C and D, the coordinates of your current location. Find the shortest path to obtain the four kinds of resources and go back.
 
Input
The first line contains the number T of test cases(T<=150). Each of the following T lines consists of six integers cx, cy, dx, dy, hx and hy. (cx, cy) is the coordinates of resource C, (dx, dy) is the coordinates of resource D, (hx, hy) is the coordinates of your current location.
All the numbers of the input are in the range [-1000, 1000].
 
Output
Your program should produce a single line for each test case containing the length of the shortest path. The answers should be rounded to two digits after the decimal point.
 
Sample Input
3
1 1 2 2 3 3
1 1 -1 -1 -1 -1
1 -1 1 1 -1 1
 
Sample Output
8.49
5.66
6.83
 
Author
hanshuai
 
 
题意:给你C,D两点的坐标,再给起点H的坐标,A在x轴上任意位置,B在y轴上任意位置,要求从起点出发经过A,B,C,D四点后回到起点的最小距离。
 
有点麻烦的一道题,也是照着别人博客写的,每种情况都要分析。
 
用到了镜面定理:

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

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

附上代码:

  1 #include <iostream>
  2 #include <cstdio>
  3 #include <cstring>
  4 #include <cmath>
  5 using namespace std;
  6 
  7 struct Point
  8 {
  9     double x,y;
 10 }h,p[3];
 11 
 12 double mins(double a,double b)
 13 {
 14     return a<b?a:b;
 15 }
 16 
 17 double dis(Point a, Point b)  ///两点之间的距离
 18 {
 19     return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));
 20 }
 21 
 22 double cale()
 23 {
 24     int a=0,b=1;
 25     double ret=dis(h,p[a])+dis(p[a],p[b])+dis(p[b],h);
 26     double ha,ab,bh;
 27     bool cx=0,cy=0;
 28     if(h.x*p[a].x<=0||h.x*p[b].x<=0||p[a].x*p[b].x<=0)
 29     cx=1;
 30     if(h.y*p[a].y<=0||h.y*p[b].y<=0||p[a].y*p[b].y<=0)
 31     cy=1;
 32     if(!cx&&!cy) ///三个点在同一个坐标系(看不懂后面的计算,需要自己画图理解)
 33     {
 34         Point t1,t2;
 35         t1.x=h.x;
 36         t1.y=-h.y;
 37         t2.x=-p[a].x;
 38         t2.y=p[a].y;
 39         ha=ret-dis(h,p[a])+dis(t1,t2);
 40 
 41         t1.x=p[b].x;
 42         t1.y=-p[b].y;
 43         t2.x=-p[a].x;
 44         t2.y=p[a].y;
 45         ab=ret-dis(p[a],p[b])+dis(t1,t2);
 46 
 47         t1.x=p[b].x;
 48         t1.y=-p[b].y;
 49         t2.x=-h.x;
 50         t2.y=h.y;
 51         bh=ret-dis(h,p[b])+dis(t1,t2);
 52 
 53         double ans=mins(ha,mins(ab,bh));
 54 
 55         t1.x=p[a].x;
 56         t1.y=-p[a].y;
 57         t2.x=-p[a].x;
 58         t2.y=p[a].y;
 59         ans=mins(ans,ret-dis(p[a],h)+dis(t1,h)-dis(p[a],p[b])+dis(t2,p[b]));
 60         ans=mins(ans,ret-dis(p[a],p[b])+dis(t1,p[b])-dis(p[a],h)+dis(t2,h));
 61 
 62         t1.x=h.x;
 63         t1.y=-h.y;
 64         t2.x=-h.x;
 65         t2.y=h.y;
 66         ans=mins(ans,ret-dis(p[a],h)+dis(t1,p[a])-dis(h,p[b])+dis(t2,p[b]));
 67         ans=mins(ans,ret-dis(h,p[b])+dis(t1,p[b])-dis(p[a],h)+dis(t2,p[a]));
 68 
 69         t1.x=p[b].x;
 70         t1.y=-p[b].y;
 71         t2.x=-p[b].x;
 72         t2.y=p[b].y;
 73         ans=mins(ans,ret-dis(p[a],p[b])+dis(t1,p[a])-dis(h,p[b])+dis(t2,h));
 74         ans=mins(ans,ret-dis(h,p[b])+dis(t1,h)-dis(p[a],p[b])+dis(t2,p[a]));
 75 
 76         ret=ans;
 77     }
 78     else if(cx==1&&!cy)
 79     {
 80         Point tmp;
 81         tmp.x=p[a].x;
 82         tmp.y=-p[a].y;
 83         ha=ret-dis(h,p[a])+dis(h,tmp);
 84         ab=ret-dis(p[a],p[b])+dis(tmp,p[b]);
 85 
 86         tmp.x=p[b].x;
 87         tmp.y=-p[b].y;
 88         bh=ret-dis(h,p[b])+dis(h,tmp);
 89 
 90         ret=mins(ha,mins(ab,bh));
 91     }
 92     else if(!cx&&cy==1)
 93     {
 94         Point tmp;
 95         tmp.x=-p[a].x;
 96         tmp.y=p[a].y;
 97         ha=ret-dis(h,p[a])+dis(h,tmp);
 98         ab=ret-dis(p[a],p[b])+dis(tmp,p[b]);
 99 
100         tmp.x=-p[b].x;
101         tmp.y=p[b].y;
102         bh=ret-dis(h,p[b])+dis(h,tmp);
103 
104         ret=mins(ha,mins(ab,bh));
105     }
106 
107     return ret;
108 }
109 
110 int main()
111 {
112     int T;
113     scanf("%d",&T);
114     while(T--)
115     {
116         scanf("%lf%lf%lf%lf%lf%lf",&p[0].x,&p[0].y,&p[1].x,&p[1].y,&h.x,&h.y);
117         printf("%.2lf
",cale());
118     }
119     return 0;
120 }
原文地址:https://www.cnblogs.com/pshw/p/5719077.html