描述 Description | |||
某敌战区是一个封闭的多边形,用相邻的顶点集合P1(x1,y1),P2(x2,y2),......, Pn(xn,yn)表示。 我方侦察员ZDM-007要穿越敌战区的封锁线,为了安全起见,ZDM-007行走的路线垂直于X坐标轴,从南向北穿越。 现在已知侦察员ZDM-007所处的位置,你能算出他在穿越封锁线时,在敌战区内的路线距离是多少吗?(Y方向的长度) | |||
输入格式 Input Format | |||
第一行: N 表示多边形顶点的个数 接下来N行: Xi Yi 表示多边形的顶点坐标 (逆时针顺序给出) 最后一行: Xa Ya 表示侦察员所处的位置 | |||
输出格式 Output Format | |||
侦察员穿越封锁线时,在敌战区内的路线距离(Y方向的长度),仅输出总的路线长度的整数部分。 | |||
OK。。。#include<iostream>
#include<iomanip>
#include<cstdio>
#include<algorithm>
using namespace std;
struct da
{
int x1,y1,x2,y2;
}L[120];
int N,Xa,Ya,T=1;
double P[120],Ans=0;
void init()
{
cin>>N;
for(int i=1;i<=N;i++)
{
cin>>L[i].x1>>L[i].y1;
L[i-1].x2=L[i].x1,L[i-1].y2=L[i].y1;
}
L[N].x2=L[1].x1,L[N].y2=L[1].y1;//存边
cin>>Xa>>Ya;
//cout<<"+++++++++++++++++++++++++++++++"<<endl;
//cout<<"+++++++++++++++++++++++++++++++"<<endl;
//cout<<"+++++++++++++++++++++++++++++++"<<endl;
//for(int i=1;i<=N;i++)
//printf("%d %d %d %d\n",L[i].x1,L[i].y1,L[i].x2,L[i].y2);
}
void work_out(int i)//按y=kx+b计算交点
{
double k=(L[i].y2-L[i].y1)*1.0/(L[i].x2-L[i].x1);
double b=L[i].y1-k*L[i].x1;
P[T++]=k*Xa+b;
}
void checkk_x2(int i)
{
if(L[i].x1<Xa&&L[i+1].x2<Xa || L[i].x1>Xa&&L[i+1].x2>Xa)
return;
else P[T++]=L[i].y2;
}
int main()
{
init();
for(int i=1;i<=N;i++)
{
if((L[i].x1>Xa&&L[i].x2<Xa)||(L[i].x1<Xa&&L[i].x2>Xa))
work_out(i);
else
{
if(L[i].x1==Xa&&L[i].x2==Xa)
{
Ans+=abs(L[i].y1-L[i].y2);
i++;
}
else
{
if(L[i].x2==Xa)
{
checkk_x2(i);
i++;
}
else if(L[i].x1==Xa)
P[T++]=L[i].y1;
}
}
}//分类如上。。。
sort(P+1,P+T);
for(int i=1;i<T;i++)
if(i%2==0)
Ans+=P[i]-P[i-1];
cout<<int(Ans)<<endl;
return 0;
}