思路:
这道题和 UVA221 Urban Elevations 思路一样的;用结构体pot存x,y的值;
用double数组x存下每一个可以做对称轴的点,然后sort,unique,然后遍历每一个对称轴,
写一个函数看看这个对称轴可不可以完成折叠;怎么看可不可以完成折叠呢?
首先把一个坐标轴上的点都用 map<pot,bool> 存起来,再遍历一些点看看它的对称点
在不在坐标轴上,如果都在说明可以折叠。
注意:
结构体pot要重载 < 才能做map的key。
1 #include<iostream>
2 #include<cstdio>
3 #include<map>
4 #include<algorithm>
5 using namespace std;
6 #define maxn 1010
7 struct pot {
8 int x, y;
9 bool operator<(const pot &p)const//重载<
10 {
11 return this->x < p.x || (this->x == p.x&&this->y < p.y);
12 }
13 };
14 map<pot, bool> pic;//每个点在是否在坐标轴上
15 double x[maxn*2];
16 pot p,pots[maxn];
17 int n;
18 bool find(double mx)//以mx为轴可不可以折叠
19 {
20 for (int i = 0; i <= n/2; i++)
21 {
22 pot p1;//p1是以mx为轴的pots[i]的对称点
23 p1.x = mx*2-pots[i].x;
24 p1.y = pots[i].y;
25 if (!pic[p1])//对称点在坐标轴上
26 {
27 return false;
28 }
29 }
30 return true;
31 }
32
33 int main()
34 {
35 int t;
36 scanf("%d", &t);
37 while (t--)
38 {
39 scanf("%d", &n);
40 for (int i = 0; i < n; i++)
41 {
42 scanf("%d%d", &p.x, &p.y);
43 pots[i] = p;
44 pic[p] = true;
45 x[i*2] = p.x;
46 if (i != 0)//两点的中点也可以做对称轴
47 x[(i-1) * 2 + 1] = (x[(i - 1) * 2] + x[i * 2]) / 2.0;
48
49 }
50
51 sort(x, x + n*2);
52 int m = unique(x, x + n*2) - x;
53
54 bool ok = false;
55 for (int i = 0; i < m; i++)
56 {
57 if (find(x[i]))
58 {
59 ok = true;
60 //printf("i=%d x[%d]=%lf\n", i,i,x[i]);
61 break;
62 }
63 }
64
65 if (ok)
66 printf("YES\n");
67 else
68 printf("NO\n");
69 }
70
71 return 0;
72 }