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.
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.
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.
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
YES NO YES
題意;在坐標系中給出的點中,尋找一個豎直的對稱軸,讓這些點關於它對稱,如果它存在,輸出YES,否則輸出NO
看了很多人的博客,大多數此題用STL解決,了解它會更容易,但是我不太會,所以還是介紹的是一種自己好理解的避免出現精度問題的方法(坐標*2)
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)
break;
}
if(j>n) break;
}
if(i>n)
cout<<"YES"<<endl;
else
cout<<"NO"<<endl;
}
}