本题来自牛客网,为网易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即可。
对于这个算法的改进,大概只有可以依据三个点来确定能否组成等腰直角三角形,并且求出剩下一点的位置,并以此来看最后一个点的四种旋转状态是否符合。
由于算法过于粗暴,所以本次解决方案不贴代码。(才不是我懒得贴) 若有读者有更加巧妙的解决方案或者独特的见解欢迎评论交流。
今天上课,老师教了小易怎么计算加法和乘法,乘法的优先级大于加法,但是如果一个运算加了括号,那么它的优先级是最高的。例如: