POJ 1940 Polygon Programming with Ease(给出线段中点求端点+解简单方程)

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;
}

你可能感兴趣的:(Algorithm,算法,ACM,poj,计算几何)