颓废的一个下午,一直在切水题,(ˉ▽ ̄~)
首先如果这些点是对称的话,那么它们的对称轴就是x = m,m是横坐标的平均值。
把这些点放到一个集合里,然后扫描每个点,计算出它关于x = m的对称点,看这个点是否在集合里面。
如果有一个不在的话,说明不能构成对称图形。
#include <cstdio>
#include <algorithm>
#include <set>
using namespace std; struct Point
{
int x, y;
Point(int x = , int y = ):x(x), y(y) {}
bool operator < (const Point& rhs) const
{ return x < rhs.x || (x == rhs.x && y < rhs.y); }
}; const int maxn = + ;
Point p[maxn]; int main()
{
//freopen("in.txt", "r", stdin); int T, n;
scanf("%d", &T);
while(T--)
{
scanf("%d", &n);
set<Point> hehe;
double s = , m;
for(int i = ; i < n; i++)
{
scanf("%d%d", &p[i].x, &p[i].y);
hehe.insert(p[i]);
s += p[i].x;
}
m = s / n;
bool ok = true;
for(int i = ; i < n; i++)
{
Point t((int)(m*)-p[i].x, p[i].y);
if(!hehe.count(t)) { ok = false; break; }
}
printf("%s\n", ok ? "YES" : "NO");
} return ;
}
代码君