POJ 1940 Polygon Programming with Ease(给出线段中点求端点+解简单方程)
http://poj.org/problem?id=1940
题意: ZOJ 1974
POJ1939是给出n个正好构成一个多边形的点的坐标,要我们求每条边的中点坐标. 此题是给出我们该多边形的每条边的中点,然后要我们求该多边形的每个端点坐标.(同样按顺序给出,按顺序输出)
分析:
我们分析用例1吧.5个点坐标为:x1,y1,x2,y2,x3,y3,x4,y4,x5,y5.那么有下面公式:
x1+x2=14*2
x2+x3=20*2
x3+x4=18*2
x4+x5=12*2
x5+x1=10*2
那么我们可以看到用 +1等式 -2等式 +3等式-4等式+5等式 可以推出 2*x1 = 20. 即如下所示:
+ x1+x2=14*2
– x2+x3=20*2
+ x3+x4=18*2
– x4+x5=12*2
+ x5+x1=10*2
那么我们知道了x1的值之后如何计算x2,x3,x4..值呢?
x2= 2等式右边的值 – x1的值.
x3= 3等式右边的值 – x2的值,
依次类推.
最终我们求出了所有x坐标.y坐标同理可得.
注意n为奇数,如果n为偶数,是有无穷解的.
x1+x2=2
x2+x3=2
x3+x4=2
x4+x1=2
如上面4个坐标, 由1等式+3等式-2等式 可以推出4等式. 所以有无穷解.
AC代码:
#include<cstdio> #include<cstring> #include<algorithm> #include<cmath> using namespace std; const int maxn=1000+5; struct Point { double x,y; Point(){} Point(double x,double y):x(x),y(y){} }P[maxn],S[maxn]; int main() { int n; while(scanf("%d",&n)==1) { S[0].x=S[0].y=0; for(int i=0;i<n;++i) { scanf("%lf%lf",&P[i].x,&P[i].y); if(i%2==0) { S[0].x += P[i].x; S[0].y += P[i].y; } else { S[0].x -= P[i].x; S[0].y -= P[i].y; } } for(int i=1;i<n;++i) { S[i].x = P[i-1].x*2-S[i-1].x; S[i].y = P[i-1].y*2-S[i-1].y; } printf("%d",n); for(int i=0;i<n;++i) printf(" %.6lf %.6lf",S[i].x,S[i].y); printf("\n"); } return 0; }