本题的难点是如何判断几个点组成的图形是否对称,只要能发现所有点的横坐标的和求平均数得到的横坐标恰好是对称轴所在的位置就好了。求出对称轴后再把各点到对称轴的距离求出来排序,这个问题就解决了。要注意对称轴和点到对称轴的距离可能不是整数。
题目链接:UVa 1595
AC代码:
#include <iostream>
#include <algorithm>
using namespace std;
const int maxn = 1000;
struct Point {
int x, y;
double dis;
Point(int x = 0, int y = 0) :x(x), y(y) {}
}p[maxn];
bool cmp(const Point& a, const Point&b) {
if(a.dis!=b.dis)
return a.dis < b.dis;
return a.y < b.y;
}
int main() {
int T;
cin >> T;
while (T--) {
int n;
double sum = 0.0;
bool flag = false;
cin >> n;
for (int i = 0; i < n; i++) {
cin >> p[i].x >> p[i]. y;
sum += p[i].x;
}
double sym = sum / n; //求出理论上的对称轴的x值
for (int i = 0; i < n; i++)
p[i].dis = abs(p[i].x - sym);
sort(p, p + n, cmp);
for (int i = 0; i < n; i++) {
if (!p[i].dis)
continue;
if (p[i].dis != p[i + 1].dis || p[i].y != p[i + 1].y) {
flag = true;
break;
}
i++; //符合条件则跳到下一对
}
if (flag)
cout << "NO" << endl;
else
cout << "YES" << endl;
}
return 0;
}