UVA 1595 Symmetry

思路:

  这道题和 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 }

猜你喜欢

转载自www.cnblogs.com/fudanxi/p/10383002.html