UVa 1595
判断二维平面上的点是否关于一条垂直线对称。
如果一条水平线(y坐标相同)上有奇数个点,则将这些点的x坐标排序后,位于中间的点就是垂直对称轴穿过的点;如果水平线上有偶数个点,则最左边的点和最右边的点的中点和次最左边的点和次最右边的点的中点应该是重合的,对于这条水平线上其它的点也是如此,据此就可以判断位于一条水平线上的点是否垂直对称,最后再判断所有水平线上的点的对称轴是否一样即可。
uDebug上的某些测试用例,包含重合的点(见下例),根据其输出可知,如果对称的话,则对称点也要有多个才行。
3
0 0
-1 0
0 0
下面的代码没有考虑重合点的情况,提交后依然可以AC。
#include <iostream>
#include <algorithm>
#include <climits>
#include <map>
#include <vector>
using namespace std;
int GetSymmetricLine(vector<int> &horizontal)
{
sort(horizontal.begin(), horizontal.end());
if (horizontal.size() % 2 == 1) {
return 2 * horizontal[horizontal.size() / 2];
}
else {
int x = horizontal.front() + horizontal.back();
for (size_t i = 1; i < horizontal.size() / 2; i++)
{
if (horizontal[i] + horizontal[horizontal.size() - 1 - i] != x) {
return INT_MAX;
}
}
return x;
}
}
int main()
{
int T = 0;
cin >> T;
for (int t = 0; t < T; t++)
{
int N = 0;
cin >> N;
map<int, vector<int>> points;
for (int n = 0; n < N; n++)
{
int x, y;
cin >> x >> y;
points[y].push_back(x);
}
int vertical = GetSymmetricLine(points.begin()->second);
if (vertical == INT_MAX) {
cout << "NO" << endl;
}
else {
bool IsSymm = true;
for (auto iter = ++points.begin(); iter != points.end(); iter++)
{
if (GetSymmetricLine(iter->second) != vertical) {
IsSymm = false;
break;
}
}
if (IsSymm) {
cout << "YES" << endl;
}
else{
cout << "NO" << endl;
}
}
}
return 0;
}
/*
3
5
-2 5
0 0
6 5
4 0
2 3
4
2 3
0 4
4 0
0 0
4
5 14
6 10
5 10
6 14
*/
本文探讨了UVa1595问题,介绍了如何在二维平面对称性判断中处理重合点,提供了一段C++代码,并针对对称轴的一致性进行验证。通过实例和代码改进,展示了如何确保对称轴正确处理特殊情况。
730





