2010年1月27日星期三.sgu136
sgu136:高斯消元的特殊形式
题目给出了一个n边形每个边的中点,也就相当于给出了两组方程。
(+) x0 + x1 = in[0][0](-) x1 + x2 = in[1][0](+) x2 + x3 = in[2][0](-) x3 + x0 = in[3][0](+) y0 + y1 = in[0][1](-) y1 + y2 = in[1][1](+) y2 + y3 = in[2][1](-) y3 + y0 = in[3][1]然后对于这两组方程,分别按照奇偶关系,直接将四组值奇加偶减
直接求出x0,y0,
然后分别带入下面的式子挨个计算即可。
1 int main()
2 {
3 int i,j,k;
4 scanf("%d",&n);
5 for (i = 1;i <= n;i++) {
6 scanf("%lf %lf",x + i,y + i);
7 x[i] *= 2;
8 y[i] *= 2;
9 }
10
11 for (i = 1;i <= n;i++) {
12 if(i & 1) {
13 rx[0] += x[i];
14 ry[0] += y[i];
15 }else {
16 rx[0] -= x[i];
17 ry[0] -= y[i];
18 }
19 }
20
21 if (n & 1) {
22 puts("YES");
23 rx[0] /= 2, ry[0] /= 2;
24 for (i = 1;i < n;i++) { rx[i] = x[i] - rx[i-1]; }
25 for (i = 1;i < n;i++) { ry[i] = y[i] - ry[i-1]; }
26 for (i = 0;i < n;i++) {
27 printf("%f %f\n",rx[i],ry[i]);
28 }
29 } else if((n & 1) == 0 && rx[0] == 0 && ry[0] == 0) {
30 puts("YES");
31 for (i = 1;i < n;i++) { rx[i] = x[i] - rx[i-1]; }
32 for (i = 1;i < n;i++) { ry[i] = y[i] - ry[i-1]; }
33 for (i = 0;i < n;i++) {
34 printf("%f %f\n",rx[i],ry[i]);
35 }
36 } else {
37 printf("NO\n");
38 }
39 return 0;
40 }
41