poj 3227. Mountain C语言

2021-06-18 05:04

阅读:460

标签:表示   while   tar   amp   type   连接   clu   pre   ons   

一道中学的平面几何问题,将目视点与所有其他点连接作为视线,可以看出斜率最大的点后面的山都是看不见的,从前到后计算每点斜率,若靠后点斜率小于靠前点,则看不到两点间山,取到新最大斜率点p时,将原最大斜率点延长,与p及p前一个点的交点即为可以看见的最低位置,求出该交点到p点距离。重复并将距离相加,所得即为所求。

 

在计算距离的distance函数中,我先定义两个变量dx、dy表示亮点横纵坐标之差,但测试时发现结果不准确。尽量在同一个式子中运算可以减少浮点数运算的误差。

 

C语言代码

 1 #include  2 #include  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 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 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 }    

 

poj 3227. Mountain C语言

标签:表示   while   tar   amp   type   连接   clu   pre   ons   

原文地址:https://www.cnblogs.com/timelimitexceed/p/9717494.html


评论


亲,登录后才可以留言!