首页 > UVa 10180 - Rope Crisis in Ropeland!

UVa 10180 - Rope Crisis in Ropeland!

题目链接:http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=41&page=show_problem&problem=1121

题意:给出两点坐标,用一条最短的线(曲线或者直线)连接起来,坐标系中原点处有一个半径为R的圆,连线不能穿过这个圆。

分析:

这题我WA了好几次,原因是把double的坐标搞成int了,o(╯□╰)o

 1 #include 
 2 #include 
 3 #include 
 4 
 5 const double PI = acos( -1.0 );
 6 
 7 struct point
 8 {
 9     double x, y;
10 };
11 
12 point O;  //坐标原点
13 
14 double Get_Dist( point &a, point &b )    //计算两点间距离
15 {
16     return sqrt( (a.x - b.x)*(a.x - b.x) + (a.y - b.y )*(a.y - b.y) );
17 }
18 
19 double Get_Angle( double a, double b, double c )  //余弦定理求角度
20 {
21     return acos( (b*b + c*c - a*a) / (2*b*c) );
22 }
23 
24 bool check( point &m, point &n, double x, double y )  //判断坐标( x, y )是否在点 m, n 之间
25 {
26     double minx = m.x < n.x ? m.x : n.x;
27     double maxx = m.x > n.x ? m.x : n.x;
28     double miny = m.y < n.y ? m.y : n.y;
29     double maxy = m.y > n.y ? m.y : n.y;
30     return ( x > minx && x <= maxx && y >= miny && y <= maxy );
31 }
32 
33 bool Judge( point &m, point &n, double &R )           //判断是否需要绕过圆
34 {
35     if ( m.x == n.x )                                 //特判与y轴平行的线
36     {
37         if ( abs(m.x) >= R ) return true;
38         else
39         {
40             if ( m.y * n.y > 0 ) return true;
41             else return false;
42         }
43     }
44     else if ( m.y == n.y )                             //特判与x轴平行的线
45     {
46         if ( abs(m.y) >= R ) return true;
47         else
48         {
49             if ( m.x * n.x > 0 ) return true;
50             else return false;
51         }
52     }
53 
54     double A = n.y - m.y;                              //两点连成的直线,求直线方程一般式,计算A, B, C
55     double B = m.x - n.x;
56     double C = (n.x - m.x) * m.y - (n.y - m.y) * m.x;
57     double dis = abs(C)/ sqrt( A*A + B*B );            //原点到直线的距离
58     if ( dis >= R ) return true;
59     else
60     {
61         double kkk = (-A) / B;
62         double bbb = (-C) / B;
63         double xx = ( -bbb ) / ( kkk + 1.0 / kkk );
64         double yy = ( (-1.0) / kkk ) * xx;
65         if ( check( m, n, xx, yy ) ) return false;     //如果线段穿过圆
66         else return true;                              //如果线段不穿过圆
67     }
68 }
69 
70 int main()
71 {
72     int T;
73     double R;
74     point A, B;
75     O.x = 0;
76     O.y = 0;
77     scanf( "%d", &T );
78     while ( T-- )
79     {
80         scanf( "%lf%lf%lf%lf%lf", &A.x, &A.y, &B.x, &B.y, &R );
81 
82         if ( Judge(A, B, R) )                             //如果不需要绕过圆
83             printf( "%.3f
", Get_Dist(A, B) );
84         else                                              //如果需要绕过圆
85         {
86             double L1 = Get_Dist(A, O);
87             double L2 = Get_Dist(B, O);
88             double LL1 = sqrt( L1*L1 - R*R );
89             double LL2 = sqrt( L2*L2 - R*R );
90             double angle = Get_Angle( Get_Dist(A, B), L1, L2 ) - acos( R/L1 ) - acos( R/L2 );
91             double ans = LL1 + LL2 + R * angle;
92             printf( "%.3f
", ans );
93         }
94     }
95     return 0;
96 }

转载于:https://www.cnblogs.com/GBRgbr/archive/2012/08/21/2649587.html

更多相关:

  • Qt默认的QSlider和QSpinbox只能实现整数调整,不能实现浮点的变化,因此设计了如下可实现浮点变化的QFloatSlider和QFloatSpinner: QFloatSlider.h class QFloatSlider : public QSlider {Q_OBJECTpublic:QFloatSlider(QWi...

  • 一、概述 之前的文章介绍过卡尔曼滤波算法进行定位,我们知道kalman算法适合用于线性的高斯分布的状态环境中,我们也介绍了EKF,来解决在非高斯和非线性环境下的机器人定位算法。但是他们在现实应用中存在计算量,内存消耗上不是很高效。这就引出了MCL算法。 粒子滤波很粗浅的说就是一开始在地图空间很均匀的撒一把粒子,然后通过获取机器人的...

  • 1.精度问题 由于是double类型,r=mid 而不是r=mid-12.如果首位两端(f(0)和f(100))同号,证明解不在[1,100]区间内 这是我之所以TE的原因,没有预先判断3.若在这个区间内,则一定可要求出解 所以binarysearch 返回m#include #include ...

  • 代理(Proxy)模式给某一个对象提供一个代理,并由代理对象控制对原对象的引用。 代理模式的英文叫做Proxy或Surrogate,中文都可译成"代理"。所谓代理,就是一个人或者一个机构代表另一个人或者另一个机构采取行动。在一些情况下,一个客户不想或者不能够直接引用一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。 类图:...

  • /*判断屏幕宽高比是否为16:9*/ function isScreen16to9() {return window.screen.height / window.screen.width === 9 / 16; }...

  • /*关闭、刷新、跳转、离开当前网页前提示*/ onbeforeunload = function () {return false; };  ...

  • let json = {/**判断JSON格式*/ isJSON: function (str) {if (typeof str == "string") {try {var obj = JSON.parse(str);if (typeof obj == "object" && obj) {return true;} else {...

  •   项目结构   index.js //必须要安装否则就别想运行了❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤ //npm i body-parser -D & cnpm i express & cnpm i node-xlsx & cnp...

  • 一、递归 函数    为什么要有函数,提高代码的可读性,避免重复的代码,提高代码的复用性      在函数中能用return的不要print 1、递归的最大深度997 def foo(n):print(n)n+=1foo(n) foo(1) 递归的最大深度 2、修改递归的最大深度     由此我们可以看出,未报错之前能看到的最大数...