Symmetry
Description
The figure shown on the left is left-right symmetric as it is possible to fold the sheet of paper along a vertical line, drawn as a dashed line, and to cut the figure into two identical halves. The figure on the right is not left-right symmetric as it is impossible to find such a vertical line.
Write a program that determines whether a figure, drawn with dots, is left-right symmetric or not. The dots are all distinct.
Input
The input consists of T test cases. The number of test cases T is given in the first line of the input file. The first line of each test case contains an integer N , where N ( 1N1, 000) is the number of dots in a figure. Each of the following N lines contains the x-coordinate and y-coordinate of a dot. Both x-coordinates and y-coordinates are integers between -10,000 and 10,000, both inclusive.
Output
Print exactly one line for each test case. The line should contain `YES' if the figure is left-right symmetric. and `NO', otherwise.
The following shows sample input and output for three test cases.
Sample Input
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
Sample Output
YES NO YES
题意:
给出一张图,图上有一些点,你要做的就是找到一条线可以将这些点对称分开,如果能找到,输出yes,找不到输出no
思路:
最重要的一句“The figure on the right is not left-right symmetric as it is impossible to find such a vertical line”,vertical说明只需要垂直的竖线,那就好办多l
首先随便找到处于同一行的对称两点,通过它们求出中点,那么这条线就找到了。
然后枚举判断每一行的对称点到这条线的距离是否相等,如果不相等,马上break掉,输出no。
然后考虑数据结构,因为处在同一行的点你不知道会有多少,所以使用不定长数组vector会比较方便
再想到如果仅仅就以y为vector数组的下标,后面的枚举会不好进行,所以只需要开一个数组记录一下就好了,y的值是什么并不重要。
还有就是为了找到同一行对称两点,应该对那一行先排一下序,然后就好找了
代码:
#include"iostream"
#include"cstdio"
#include"cstring"
#include"vector"
#include"algorithm"
using namespace std;
const int maxn=10000+10;
vector<int>pile[maxn];
int book[2*maxn+10];
int top,flag;
void Init()
{
int n;
cin>>n;
memset(pile,0,sizeof(pile));
memset(book,0,sizeof(book));
top=1;
int x,y;
for(int i=0;i<n;i++)
{
cin>>x>>y;
y+=10000;
if(!book[y]) book[y]=top++;
pile[book[y]].push_back(x);
}
}
void Work()
{
sort(pile[1].begin(),pile[1].end());
int mid=(pile[1][0]+pile[1][pile[1].size()-1])/2;
flag=0;
for(int k=1;k<top;k++)
{
sort(pile[k].begin(),pile[k].end());
for(int j=0;j<pile[k].size();j++)
{
if(((pile[k][j]+pile[k][pile[k].size()-j-1])/2)!=mid)
{
flag=1;
break;
}
}
if(flag) break;
}
}
void Print()
{
cout<<(flag==1?"NO":"YES")<<endl;
}
int main()
{
int T;
cin>>T;
while(T--)
{
Init();
Work();
Print();
}
return 0;
}