uva1595 [5-6]

本文介绍了一种用于判断二维平面上一系列点是否构成左右对称图形的算法。通过计算所有点的对称轴并检查每一点是否存在其对称点来实现。使用了pair和set数据结构来存储和查找点坐标,确保了算法的高效运行。

首先计算出对称轴:(最左边的横坐标+最右边的横坐标)/ 2   因为存在对称轴的话肯定是以俩个端点的对称轴为目标

 然后遍历所有点,看每个点是否有它所对称的那个点,这个用set查找,提前输入时将所有点都放入set集合中

  如果都能找到即为YES否则NO;

其中用到了pair,同时将x y轴坐标存入set集合,存x坐标时,所有点都乘二,避免除二时出现小数。

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

#include<iostream>
#include<set>
using namespace std;
const int maxn=10005;
typedef pair <int,int> point;
set<point> xy;
int x[maxn],y[maxn],zhou;
int ok(int i,int n)
{
	int j;
	for(j=0;j<n;j++)
	if(y[i]==y[j] && (x[i]+x[j])/2==zhou) return 1;
	return 0;
}
int main()
{
	int t,n,i,j;
	cin>>t;
	while(t--)
	{
		int minx=999999,maxx=-999999;
		cin>>n;
		for(i=0;i<n;i++)
		{
			cin>>x[i]>>y[i];
			x[i]*=2;
			xy.insert(point(x[i],y[i]));
			minx = min(minx,x[i]);
            maxx = max(maxx,x[i]);
		}
		zhou=(minx+maxx)/2;
		for(i=0;i<n;i++)
		{
			if(!ok(i,n))
			break;
		}
		if(i>=n)
		cout<<"yes"<<endl;
		else
		cout<<"no"<<endl;
	}
}


-2 5                                         
0 0 
6 5 
4 0 
2 3 

2 3 
0 4 
4 0 
0 0 

5 14 
6 10
5 10 
6 14
Sample Output 
YES 
NO 
YES

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值