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.那么有下面公式:
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;
}