您的位置:首页 > 其它

uvaoj-1595:symmetry

2016-02-25 20:22 274 查看
1595 - Symmetry

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 ( 1

N

1,
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


题解:刘汝佳白书135页练习题5.6;本题可以考虑暴力求解,也可以用set的查找来进行;

code:

#include <iostream>

#include <set>

#include <string>

using namespace std;

typedef pair<int,int> point;//定义类型;(不可以用预处理)

set<point> se;

int main()

{

int cas;

int n;

int x,y;

cin>>cas;

while(cas--)

{

se.clear();

cin>>n;

int sum=0;

for(int i=0; i<n; i++)

{

cin>>x>>y;

sum+=x;//将所有横坐标加和;

se.insert(point(x*n,y));//(备注1)

}

/*
set<point> ::iterator it;

for(it=se.begin(); it!=se.end(); ++it)

{

point p=*it;

cout<<p.first<<" "<<p.second<<endl;

}
*/

set<point> ::iterator it;

bool flag = true;

for(it=se.begin(); it!=se.end(); ++it)

{

point p=*it;

if(se.find(point(2*sum-p.first,p.second))==se.end())

{

flag=false;

break;

}

}

flag? cout<<"YES"<<endl: cout<<"NO"<<endl;

}

return 0;

}

备注1:

x*n的意思,就是存储的时候将横坐标扩大n倍,因为对称轴肯定是竖线,所以假设对称的话所有的横坐标加和再与n想除得出的应该就是答案的x坐标;之所以不是将sum/n,是因为考虑到精度的问题,除的话会出现double类型;换而言之,这个存储方式就是将所有横坐标扩大了n倍;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: