Symmetry
Time Limit:3000MS Memory Limit:0KB 64bit IO Format:%lld & %lluDescription
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
看了很多人的博客,大多数此题用STL解决,了解它会更容易,但是我不太会,所以还是介绍的是一种自己好理解的避免出现精度问题的方法(坐标*2)
备注:
double类型进行运算会有精度误差.
比如
double a=1,b=1;
a-b可能不等于0,而是等于一个接近0的小数。所以我们认为只要a-b小于一个足够小的数(eps)的话,那么就可以认为a=b。
AC代码:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
using namespace std;
const double eps=1e-5;//1e-5:浮点数,在计算机中这么表示,在数学中是科学计数法.1e-5的意思就是1乘以10的负5次幂。就是0.000001
int x[1010],y[1010];
int main()
{
int T;
cin>>T;
while(T--)
{
int n,i,j;;
cin>>n;
double sum=0;
for(i=1; i<=n; i++)
{
cin>>x[i]>>y[i];
sum+=x[i];
}
sum/=n;
for(i=1; i<=n; i++)
{
for(j=1; j<=n; j++)
{
if(abs(2*sum-x[i]-x[j])<eps&&abs(y[i]-y[j])<eps) //这里相当于判断2*sum是否等于x[i]+y[j]且y[i]是否等于y[j]
break;
}
if(j>n) break;
}
if(i>n)
cout<<"YES"<<endl;
else
cout<<"NO"<<endl;
}
}