华为机试【18、构成的正方形数量】

18、标题:构成的正方形数量
【构成正方形数量】输入N个互不相同的二维整数坐标,求这N个坐标可以构成的正方形数量。(内积为零的的两个向量垂直)
输入描述:
第一行输入为N,N代表坐标数量,N为正整数。N<=100之后的K行输入为坐标xy以空格分隔,xy为整数,-10<=x,y<=10
输出描述:
输出可以构成的正方形数量。
示例1:输入
3
1 3
2 4
3 1
输出
0

def square(s):
    from itertools import combinations, permutations
    def is_square(s):
        arrs = permutations(s, 4)  # 因为不知道四个坐标的顺序,所以只好排列一下穷举所有可能的顺序,四个坐标排列,共有A(4, 4) = 24种情况
        for arr in arrs:
            ac = (arr[2][0] - arr[0][0], arr[2][1] - arr[0][1])
            bd = (arr[3][0] - arr[1][0], arr[3][1] - arr[1][1])
            ab = (arr[1][0] - arr[0][0], arr[1][1] - arr[0][1])
            bc = (arr[2][0] - arr[1][0], arr[2][1] - arr[1][1])
            dc = (arr[2][0] - arr[3][0], arr[2][1] - arr[3][1])
            ad = (arr[3][0] - arr[0][0], arr[3][1] - arr[0][1])
            # 对角线垂直,临边均相互垂直的四边形为正方形,即:ac⊥bd、ab⊥bc、bc⊥dc、dc⊥ad、ad⊥ab
            if ac[0] * bd[0] + ac[1] * bd[1] == 0 and ab[0] * bc[0] + ab[1] * bc[1] == 0 and \
                    bc[0] * dc[0] + bc[1] * dc[1] == 0 and dc[0] * ad[0] + dc[1] * ad[1] == 0 and \
                    ad[0] * ab[0] + ad[1] * ab[1] == 0:
                return True

    if len(s) < 4:
        return 0
    num = 0
    for arr in combinations(s, 4):  # 排列组合:C(len(s), 4)
        arr = list(arr)
        if is_square(arr):
            num += 1
    return num


# 下列9个点,可以组成6个正方形
#   * * *
#   * * *
#   * * *
print(square([(0, 0), (0, 1), (0, 2), (1, 0), (1, 1), (1, 2), (2, 0), (2, 1), (2, 2)]))
全部评论
这样会超时,通过率只有30左右
1 回复 分享
发布于 2022-06-25 18:33
感觉这道题完全就是在考察数学啊,又是排列又是组合,另外还有向量点积,太难了
点赞 回复 分享
发布于 2022-04-01 12:15
Java版本 https://blog.csdn.net/qq_34465338/article/details/124494644
点赞 回复 分享
发布于 2022-05-15 20:26
如果只用两个点来决定一个正方形,然后再判断是否四个点都齐全,然后循环会不会更好点。
点赞 回复 分享
发布于 2023-02-24 17:56 天津

相关推荐

10-21 23:14
武汉大学 Java
中兴部门匹配了2个月,一看调剂了,我还以为换到测开了
fanfanfm:别说了,给我打电话问能不能接受全球岗,要给我发派到非洲去😓
点赞 评论 收藏
分享
Mush3r:1. 项目包装一下,比如说“跟某某电网/企业合作,已经实际交付”之类的,这样别人就觉得你至少是个实际的项目不是个玩具项目; 2. 对于 axios 这种工具,不要写“利用”,别人觉得是就是在调包,没什么技术含量,要写“重新封装”,可能实际上就是封装了一些 url 前缀之类的,但是听起来就更高级一点; 3. 结合缓存实现用户登陆,你作为前端是如何实现的?如何鉴权?token 过期如何设置?如何保证非登录用户不能访问页面/请求拦截器?一个都写没,前面这些都是面试会问的问题,但是面试官看了你这句话可能也不知道该问什么; 4. 利用 Vue3,通过 。。。 组件库,又是调包,这种没什么工作量,就是拿过来用一用的就不要往详情里写了,开头总结的时候提一嘴就行了; 后面小程序不怎么懂,不评价了
点赞 评论 收藏
分享
点赞 评论 收藏
分享
3 6 评论
分享
牛客网
牛客企业服务