腾讯2018安卓实习模拟笔试题——魔法阵

真的觉得自己数据结构与算法也太薄弱了,好多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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值