Online JudgeProblem SetAuthorsOnline ContestsUser
Web Board
Home Page
F.A.Qs
Statistical Charts
Problems
Submit Problem
Online Status
Prob.ID:
Register
Update your info
Authors ranklist
Current Contest
Past Contests
Scheduled Contests
Award Contest
User ID:
Password:
  Register

不明白为什么这样做会错,哪位路过的好心人帮我看看,给我个数据吧~~~~~

Posted by johnlin55 at 2007-09-16 22:30:21 on Problem 3227
#include<stdio.h>
#include<math.h>
#include<iostream>
using namespace std;

typedef struct point
{
   double x,y;
} Point;

Point p[1001];

  //功能:求点在有向线段(a   →   b)左边还是右边   
  //返回:0共线、1左边、-1右边   

int JudgeSide(Point b,Point a,double x,double y)
{
    double sum1,sum2;
    sum1=(y-a.y)*(x-b.x);
    sum2=(y-b.y)*(x-a.x);
    return((sum1<sum2)?-1:((sum1>sum2)?1:0));
}


//求直线p11p12与直线p21p22的交点,结果返回到ans
void Intersection(Point p11,Point p12,Point p21,Point p22,Point &ans)
{
	double k1,k2;
	k1 = (p11.y-p12.y)/(p11.x-p12.x);
	k2 = (p21.y-p22.y)/(p21.x-p22.x);
	ans.x = (k1*p11.x-k2*p21.x+p21.y-p11.y)/(k1-k2);
	ans.y = k1*(ans.x-p11.x)+p11.y;
}

//求两点距离
double len(Point a,Point b)
{
	return sqrt(pow(a.x-b.x,2)+pow(a.y-b.y,2));
}

//调整看不到的点,将该点调整到刚好能看到的地方
void getnext(double h,int th)
{
	int i,j;
	Point tmp,ans;
	tmp.x = 0;
	tmp.y = h;
	Intersection(tmp,p[th-1],p[th],p[th+1],ans);
	p[th].x = ans.x;
	p[th].y = ans.y;
}



int main()
{
	double h,sum;
	int n,i,j;
	freopen("data.txt","r",stdin);
	while(scanf("%d%lf",&n,&h)==2&&(n!=0||h>0))
	{
		sum=0.0;
		for(i=0;i<n;i++)
			scanf("%lf%lf",&p[i].x,&p[i].y);
		for(i=1;i<n;i++)
		{
			int t=JudgeSide(p[i-1],p[i],0.0,h);
			if(t==1)
				sum += len(p[i-1],p[i]);
			else if(t==-1)
				getnext(h,i);
		}
		printf("%.2f\n",sum);
	}
}

/*数据
9 5
0 0
2 5
4 1
5 2
6 1
8 8
10 2
11 3
12 0

7 6
0 0
2 5
3 2
4 3
100 1
101 6
102 0

5 0
0 0
1 2
3 1
4 100
5 0

结果
8.51
104.42
93.90
*/

Followed by:

Post your reply here:
User ID:
Password:
Title:

Content:

Home Page   Go Back  To top


All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator