1. 程式人生 > >Blizzard(暴力技巧+精度問題)

Blizzard(暴力技巧+精度問題)

color ios courier else efi ont define 一行 ace

Blizzard

Description

在魔獸爭霸之冰封王座中有一個叫冰川的地圖,裏面有魔法傳送陣,可以傳送到這個此傳送陣的對稱傳送陣位置。假設地圖是圓形的,地圖中心也就是圓心,在圓上每個點都有一個傳送陣,可以傳送到與地圖圓心中心對稱的位置。現在因為貪婪的大魔法師,人族正經歷一場浩劫,作為聰明的獸族先知,信奉趁你病要你命的原則,想要趁機占領人族的土地。你能計算最短距離能夠使獸族大軍盡快到達人族營地?

Input

第一行一個整數r(1 <= r <= 1000)代表地圖的半徑。接下來兩行兩個整數分別代表獸族出發點的位置和人族營地的位置坐標。保證兩個位置都在圓內(可能在邊界上),地圖中心在點(0, 0)上。

Output

輸出一個實數,代表獸族大軍最短需要移動多少距離。和答案相對或絕對相差1e-6都算正確。

Sample Input 1

1
0 1
0 -1

Sample Output 1

0.000000000000

Sample Input 2

4
3 0
-3 0

Sample Output 2

2.000000000000

Hint:

技術分享圖片
第二個樣例抽象圖

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cmath>
 4 #include<cstring>
 5 #include<algorithm>
 6 #define Min(a,b) a<b?a:b
 7
#define eps 1e-4 8 #define pi 3.1415926 9 using namespace std; 10 11 double ans; 12 double dis(double x0,double y0,double x1,double y1) 13 { 14 return sqrt(pow((x1-x0),2)+pow((y1-y0),2)); 15 } 16 int main() 17 { 18 double r,x1,x2,y1,y2; 19 scanf("%lf%lf%lf%lf%lf",&r,&x1,&y1,&x2,&y2);
20 /* if(abs(y1-y2)/abs(x1-x2)==1) 21 { 22 ans=2*r-(sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2))); 23 } 24 else 25 {*/ //不能寫if 因為存在兩點重合的情況 26 ans=dis(x1,y1,x2,y2); 27 for(double i=0;i<=360;i+=eps) 28 { 29 ans=Min(ans,(dis(x1,y1,r*cos(i/180*pi),r*sin(i/180*pi))+dis(x2,y2,-r*cos(i/180*pi),-r*sin(i/180*pi)))); 30 }//圓上坐標表示為(R*cos,R*sin); 31 //} 32 printf("%.8lf\n",ans); 33 return 0; 34 }




Blizzard(暴力技巧+精度問題)