题目
2-3 请再一次做我的棋子
分数 25
作者 ztx
单位 郑州轻工业大学
“世间的事,太痛苦了。我该怎样才能忘却呢?”
“下棋吧。”
“棋,能代替世间吗?”
“能。因为纵横十九道内,栖息着宇宙。”
《王者荣耀》中奕星的大招是画出一个矩形。LT 是一个强迫症患者,如果画出来的矩形不是正方形,他就会很难受。现在告诉你奕星大招的四个顶点,请你判断这个矩形是否为正方形。
输入格式:
第一行输入四个整数 xi(0≤xi≤10000)
第二行输入四个整数 yi(0≤yi≤10000)
输出格式:
如果矩形是正方形,输出 好耶!
,否则输出 emo!
。
输入样例:
0 0 2 2
0 2 0 2
输出样例:
好耶!
代码长度限制 16 KB
时间限制 400 ms
内存限制 64 MB
思路
现在题目上已经规定了该图形为矩形,我们只需判断对应的边长或对角线是否相等(咱就是说一开始没想到这方形还能歪着放,后面有个测试点没过,但是通过取巧方法通过了)
题解
#include<bits/stdc++.h>
using namespace std;
int main(){
int d_x[4],d_y[4],c[2];//d_x存横坐标,d_y存纵坐标,c用来存边长
c[0]=-1;c[1]=-1;//这个放在最后一行说
int i,m=0,j=0;
for(i=0;i<4;i++){
cin>>d_x[i];
}//输入
for(i=0;i<4;i++){
cin>>d_y[i];
}//输入
//此时的我还没有考虑到不能歪着放
for(i=0;i<3;i++){
for(j=i+1;j<4;j++){
if(d_x[i]==d_x[j]){//只要横/纵坐标相等那么他们对应坐标的差值绝对值就是长度/对角线长度
c[0]=abs(d_y[i]-d_y[j]);//不用害怕重复,因为绝对值抵消了影响
break;
}
else if(d_y[i]==d_y[j]){
c[1]=abs(d_x[i]-d_x[j]);
break;
}
}
}
if(c[0]==c[1]&&c[0]!=0)//长度相等,并且不等于0,就是正方形
cout<<"好耶!";
else
cout<<"emo!";//这还是个中文感叹号,挺抽象
//现在来解释那两个-1,就和思路里说的一样,我发现有1个点没过,考虑到歪着放,但是只有一个测试点,笔者认为比赛的话可以不用再大费周章,我用暴力输出两个结果发现那个点的结果是前者,经过模拟发现如果歪着放,c将不被重新赋值,于是笔者在开头赋予两个负值也就是不可能的值,这样完美越过了后面的判断,没有用double的大费周章,节省了比赛时间,也成功解答了题目。虽然有点不好(bushi
}
思考
如果说一定要判断是否是正方形并且越过double的复杂算法,笔者认为数学中两向量的乘积等于0,也就是判断对角线是否垂直,对于本题有着比上面的程序更好更妙的写法,但由于题目集关闭,无法再次试题,思路放在这了,这个问题留给各位友友们探索啦~