标签:表示 while tar amp type 连接 clu pre ons
一道中学的平面几何问题,将目视点与所有其他点连接作为视线,可以看出斜率最大的点后面的山都是看不见的,从前到后计算每点斜率,若靠后点斜率小于靠前点,则看不到两点间山,取到新最大斜率点p时,将原最大斜率点延长,与p及p前一个点的交点即为可以看见的最低位置,求出该交点到p点距离。重复并将距离相加,所得即为所求。
在计算距离的distance函数中,我先定义两个变量dx、dy表示亮点横纵坐标之差,但测试时发现结果不准确。尽量在同一个式子中运算可以减少浮点数运算的误差。
C语言代码
1 #include <stdio.h> 2 #include <math.h> 3 4 typedef struct 5 { 6 double x; 7 double y; 8 } point; 9 10 double getk(point p1, point p2) //求斜率 11 { 12 return ((p2.y - p1.y) * 1.0 / (p2.x - p1.x)); 13 } 14 15 double distance(point p1, point p2) //两点距离 16 { 17 // int dx = p1.x - p2.x; 18 // int dy = p1.y - p2.y; 19 return sqrt((p1.x - p2.x) * (p1.x - p2.x) + (p1.y - p2.y) * (p1.y - p2.y)) * 1.0; 20 } 21 22 point intersection(point p1, point p2, point q1, point q2) //点斜式求两线交点 23 { 24 double k1 = getk(p1, p2); 25 double k2 = getk(q1, q2); 26 double x = (k1 * p1.x - k2 * q1.x - p1.y + q1.y) * 1.0 / (k1 - k2); 27 double y = k1 * (x - p1.x) + p1.y; 28 point intsec; 29 intsec.x = x; 30 intsec.y = y; 31 return intsec; 32 } 33 34 int main(int argc, char const *argv[]) 35 { 36 int pos[1005][1005]; 37 int n; 38 double h; 39 point p[1005]; 40 while(scanf("%d %lf", &n, &h)) 41 { 42 if (n == 0 && h == 0) 43 break; 44 point start; 45 start.x = 0; 46 start.y = h; 47 for (int i = 0; i < n; ++i) 48 scanf("%lf %lf", &p[i].x, &p[i].y); 49 50 double sum = distance(p[0], p[1]); 51 double maxk = getk(p[1], start); 52 point maxp = p[1]; //斜率最大的点 53 for (int i = 2; i < n; ++i) 54 { 55 double k = getk(p[i], start); 56 if (k > maxk) 57 { 58 point intsec = intersection(start, maxp, p[i], p[i-1]); 59 sum += distance(intsec, p[i]); 60 maxp = p[i]; 61 maxk = k; 62 } 63 } 64 printf("%.2f\n", sum); 65 } 66 return 0; 67 }
标签:表示 while tar amp type 连接 clu pre ons
原文地址:https://www.cnblogs.com/timelimitexceed/p/9717494.html