每日一题-整理房间

题目描述

本题来自牛客网,为网易2019年校招题之一。(点我跳转)

题目描述:
又到了周末,小易的房间乱得一团糟。
他希望将地上的杂物稍微整理下,使每团杂物看起来都紧凑一些,没有那么乱。
地上一共有n团杂物,每团杂物都包含4个物品。第i物品的坐标用(ai,bi)表示,小易每次都可以将它绕着(xi,yi)逆时针旋转90^ \circ90

,这将消耗他的一次移动次数。如果一团杂物的4个点构成了一个面积不为0的正方形,我们说它是紧凑的。
因为小易很懒,所以他希望你帮助他计算一下每团杂物最少需要多少步移动能使它变得紧凑。
输入描述:
第一行一个数n(1 <= n <= 100),表示杂物的团数。
接下来4n行,每4行表示一团杂物,每行4个数ai, bi,xi, yi, (-104 <= xi, yi, ai, bi <= 104),表示第i个物品旋转的它本身的坐标和中心点坐标。
输出描述:
n行,每行1个数,表示最少移动次数。
时间限制:1秒 空间限制:262144K

题目分析

这道题只能暴力破解,依次查看各个旋转方向形成的点能否组成正方形。算法的唯一优化点在于如何确定四个点能否组成一个正方形。
在这里,我采用向量的方法来确认四个点(a,b,c,d)组成的四边形abcd是否是正方形。
随机选四边形abcd的三个点a,b,c,随机组成两条直线ab,bc。
然后计算两条线段长度比:

  • x=|ab|/|bc|

(1)若x=1,则算其向量点积

  • y=ab•bc。

y=0则说明ab⊥bc,因此要证明四边形abcd是正方形只需要证明

  • |ab|=|cd|∧|ab|=|da|

即可。y!=0则说明四边形abcd不是正方形。(至于为什么y!=0就可以得出四边形abcd不是正方形,读者可以自行用数学方法来证明。)

(2)若x=√2,则说明若四边形abcd是正方形那么ab是正方形abcd的对角线,此时|ab|=|cd|且ab⊥cd。因此要证明四边形abcd是正方形只需要证明

  • |ab|=|cd|∧ab⊥cd

即可。

(3)若x=1/√2,则说明若四边形abcd是正方形那么bc是正方形abcd的对角线,此时|bc|=|ad|且bc⊥ad。因此要证明四边形abcd是正方形只需要证明

  • |bc|=|ad|∧bc⊥ad

即可。


对于这个算法的改进,大概只有可以依据三个点来确定能否组成等腰直角三角形,并且求出剩下一点的位置,并以此来看最后一个点的四种旋转状态是否符合。

解决方案

由于算法过于粗暴,所以本次解决方案不贴代码。(才不是我懒得贴)
若有读者有更加巧妙的解决方案或者独特的见解欢迎评论交流。

明天的题

今天上课,老师教了小易怎么计算加法和乘法,乘法的优先级大于加法,但是如果一个运算加了括号,那么它的优先级是最高的。例如:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值