POJ 1940 公式推导

题意:

给出中点求顶点(结合样例的图)。顶点个数是奇数

 

题解:

很容易想到高斯消元,然后他为什么强调是奇数?

随便找一个奇数个点的多边形一推导,就可以直接推出其中一个待求点的坐标,然后即推算就可以了。

偶数时就不行了。。。

 

View Code
 1 #include <iostream>
 2 #include <cstdlib>
 3 #include <cstdio>
 4 #include <cstring>
 5 #include <algorithm>
 6 #include <cmath>
 7 
 8 #define N 1010
 9 
10 using namespace std;
11 //奇数条边的时候满足,偶数时不确定 
12 struct PO
13 {
14     double x,y;
15 }s[N],t[N];
16 
17 int n;
18 
19 inline void read()
20 {
21     for(int i=1;i<=n;i++) scanf("%lf%lf",&s[i].x,&s[i].y);
22 }
23 
24 inline void go()
25 {
26     double a=0.0,b=0.0;
27     for(int i=n;i>=1;i--)
28     {
29         if(i&1) a+=s[i].x,b+=s[i].y;
30         else a-=s[i].x,b-=s[i].y;
31     }
32     t[1].x=a; t[1].y=b;
33     for(int i=2;i<=n;i++)
34     {
35         t[i].x=t[i-1].x+2.0*(s[i-1].x-t[i-1].x);
36         t[i].y=t[i-1].y+2.0*(s[i-1].y-t[i-1].y);
37     }
38     printf("%d",n);
39     for(int i=1;i<=n;i++)
40         printf(" %.6lf %.6lf",t[i].x,t[i].y);
41     puts("");
42 }
43 
44 int main()
45 {
46     while(scanf("%d",&n)!=EOF) read(),go();
47     return 0;
48 }

 

 

posted @ 2013-02-24 20:11  proverbs  阅读(223)  评论(0编辑  收藏  举报