码迷,mamicode.com
首页 > 编程语言 > 详细

poj 3227. Mountain C语言

时间:2018-09-28 12:32:02      阅读:160      评论:0      收藏:0      [点我收藏+]

标签:表示   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 }    

 

poj 3227. Mountain C语言

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

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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!