真的觉得自己数据结构与算法也太薄弱了,好多stl容器都不会用,真的是练太少了导致很不熟练!
题意
刚做的,找不到题,大致说一下
给定四个点,能构成正方形输出Yes,否则输出No。
输入一个数n,代表测试样例的数量
接下来有2n行,每两行是一个测试样例
这两行的第一行有四个数字,分别对应四个点的坐标x
第二行也有四个数字,分别对应四个点的坐标y
输入
3
0 0 2 2
0 2 0 2
0 1 5 6
1 6 0 5
0 0 7 7
0 3 0 3
输出
Yes
Yes
No
思路
一开始看这样例的输入,以为所有样例都是第一个坐标是左上角,第二个坐标是右上角,第三个是左下角等,投机取巧地想判断
①、对角线长度相等。
②、两条相邻边长度相等。
这样的方式来完成,直到提交代码后看到测试样例只通过10%,心拔凉拔凉的。既然点对应哪个位置都是随机的,我们可以用
①、计算所有点之间的距离,结果有且只有两个值(也就是邻边长跟对角线长)
但是这样还有个问题,就是这个条件也满足等边三角形和中心点(其实我们输入的坐标值都是整数,所以不知道会不会出现这种情况,因为等边三角形中心点和角点感觉必有一个要带根号,但是这里还是判断下比较好),所以再判断一个
②、两个值的比值一定为1:√2
而这些点间的距离可以用一个容器来存储,如果存完容器的size不为2,肯定不满足条件①,输出No,否则再判断比值关系。(然而在选择容器的时候,我既然忘记可以用set这么有用来帮我查重,我是真的蠢,我一定要补一下STL了。。。)
代码
# include<stdio.h>
# include<iostream>
# include<stack>
# include<memory.h>
# include<vector>
# include<map>
# include<algorithm>
# include<list>
# include<queue>
# include<set>
# include<string.h>
# include<cstring>
# include<math.h>
using namespace std;
int main(void) {
int a[4][2];
int n;
cin >> n;
while (n--) {
// 初始化
for (int i=0; i<4; i++) {
cin >> a[i][0];
}
for (int i=0; i<4; i++) {
cin >> a[i][1];
}
// 算距离
set<float> qq;
for (int i = 0; i < 4; i++) {
for (int j = i+1; j < 4; j++) {
float tmp = sqrt(pow((a[i][0]-a[j][0]),2)+pow((a[i][1]-a[j][1]),2));
qq.insert(tmp);
}
}
// 判断
if (qq.size() != 2) {
cout << "No" << endl;
} else {
// 提取两个距离值出来
float haha[2];
int py = 0;
for (set<float>::iterator it = qq.begin(); it!= qq.end(); it++) {
haha[py] = *it;
py++;
}
// 判断
if ((fabs((haha[0]*sqrt(2))-haha[1]) < 0.0001) || (fabs((haha[1]*sqrt(2))-haha[0]) < 0.0001)) {
cout << "Yes" << endl;
} else {
cout << "No" << endl;
}
}
}
return 0;
}