Online Judge | Problem Set | Authors | Online Contests | User | ||||||
---|---|---|---|---|---|---|---|---|---|---|
Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest |
这题有什么bug,大牛们帮帮看下代码。 谢谢了。。。#include <stdio.h> #include <math.h> #define N 1005 struct pos{ double x,y; }; pos p[N]; int n;double h; double dis(pos a,pos b) { return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y)); } double cross(pos a,pos b,pos c) { return (b.x-a.x)*(c.y-a.y)-(b.y-a.y)*(c.x-a.x); } pos l_l_intp(pos p1, pos p2, pos q1, pos q2) { double a, b, c, d, e, f; pos te; a = p2.x-p1.x, b = p1.y-p2.y, c = p1.y*p2.x - p1.x*p2.y; d = q2.x-q1.x, e = q1.y-q2.y, f = q1.y*q2.x - q1.x*q2.y; te.x = (a*f-c*d)/(a*e-b*d); te.y = (c*e-b*f)/(a*e-b*d); return te; } void solve() { int i,j; double k1,k2; pos sta; sta.x = 0.0; sta.y = h; double ans = 0.0; ans += dis(p[0],p[1]); for(i=1;i<n;i++) { if(i&1) { k1 = (sta.y-p[i].y)/(sta.x-p[i].x); k2 = (p[i].y-p[i+1].y)/(p[i].x-p[i+1].x); if(fabs(k1-k2)<=0) { if(i<n-2) ans += dis(p[i+1],p[i+2]); } else if(k2-k1>0) { ans += dis(p[i],p[i+1]); if(i<n-2) ans += dis(p[i+1],p[i+2]); } else if(i<n-2){ for(j = i+1;j<n-1;j+=2) { if(cross(sta,p[i],p[j])<0 && cross(sta,p[i],p[j+1])>0) { pos cro = l_l_intp(sta,p[i],p[j],p[j+1]); ans += dis(cro,p[j+1]); break; } } i = j; } } } printf("%.2lf\n",ans); } int main() { int i; while(scanf("%d%lf",&n,&h)) { if(n==0 && h==0) break; if(n==0 || n==1){ printf("0.00\n"); continue; } for(i=0;i<n;i++) scanf("%lf%lf",&p[i].x,&p[i].y); solve(); } return 0; } Followed by:
Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator