1549: Navigition Problem
Time Limit: 1 Sec Memory Limit: 256 MB
Submit: 65 Solved: 12
Description
Navigation is a field of study that focuses on the process of monitoring and controlling the movement of a craft or vehicle from one place to another. The field of navigation includes four general categories: land navigation, marine navigation, aeronautic navigation, and space navigation. (From Wikipedia)
Recently, slowalker encountered a problem in the project development of Navigition APP. In order to provide users with accurate navigation service , the Navigation APP should re-initiate geographic location after the user walked DIST meters. Well, here comes the problem. Given the Road Information which could be abstracted as N segments in two-dimensional space and the distance DIST, your task is to calculate all the postion where the Navigition APP should re-initiate geographic location.
Input
The input file contains multiple test cases.
For each test case,the first line contains an interger N and a real number DIST. The following N+1 lines describe the road information.
You should proceed to the end of file.
Hint:
1 <= N <= 1000
0 < DIST < 10,000
Output
For each the case, your program will output all the positions where the Navigition APP should re-initiate geographic location. Output “No Such Points.” if there is no such postion.
Sample Input
2 0.50
0.00 0.00
1.00 0.00
1.00 1.00
Sample Output
0.50,0.00
1.00,0.00
1.00,0.50
1.00,1.00
HINT
Source
解题:此题太JB难读了,就是每次走了dist距离 然后输出此时的坐标位置,记得一定要走够dist的距离才输出坐标,还有坐标中间有逗号。。
1 #include <bits/stdc++.h> 2 using namespace std; 3 const int maxn = 1100; 4 int n; 5 double R; 6 struct Point { 7 double x,y; 8 } p[maxn]; 9 double getDis(const Point &a,const Point &b) { 10 double tmp = (a.x - b.x)*(a.x - b.x); 11 tmp += (a.y - b.y)*(a.y - b.y); 12 return sqrt(tmp); 13 } 14 vector<Point>ans; 15 int main() { 16 while(~scanf("%d %lf",&n,&R)) { 17 for(int i = 0; i <= n; ++i) 18 scanf("%lf %lf",&p[i].x,&p[i].y); 19 int low = 0,high = n; 20 Point now = p[low++]; 21 ans.clear(); 22 double hg = 0; 23 while(low <= high) { 24 double ds = getDis(now,p[low]); 25 if((ds - R + hg) > 1e-60) { 26 now.x += (p[low].x - now.x)/ds*(R-hg); 27 now.y += (p[low].y - now.y)/ds*(R-hg); 28 hg += R - hg; 29 }else{ 30 hg += ds; 31 now = p[low++]; 32 } 33 if(fabs(hg - R) < 1e-12) { 34 ans.push_back(now); 35 hg = 0.0; 36 } 37 } 38 if(ans.size()) { 39 for(int i = 0; i < ans.size(); ++i) 40 printf("%.2f,%.2f ",ans[i].x,ans[i].y); 41 } else puts("No Such Points."); 42 } 43 return 0; 44 }