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 }

 

 

你可能感兴趣的:(poj)