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

来源:互联网 发布:禁忌搜索算法的优缺点 编辑:程序博客网 时间:2024/05/20 03:36

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

0 0
原创粉丝点击