PTA 郑州轻工业大学21级天梯赛2-3请再一次做我的棋子

题目

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,也就是判断对角线是否垂直,对于本题有着比上面的程序更好更妙的写法,但由于题目集关闭,无法再次试题,思路放在这了,这个问题留给各位友友们探索啦~

  • 10
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Sinking tenderness

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值