一些简单的几何。。

593. 有效的正方形

题目
在这里插入图片描述
枚举所有情况,然后四条边相等,且对角线相等不为0. 其实所有情况只有3中哈哈。
注意这种情况:
[0,0]
[1,1]
[0,0]
[0,1]
dis(p1,p2)=dis(p2,p3)=dis(p3,p4)=dis(p4,p1)=2,。。 但不是正方形。

class Solution {
public:
    int dis(vector<int>&p1,vector<int>&p2){
        return (p1[0]-p2[0])*(p1[0]-p2[0])+(p1[1]-p2[1])*(p1[1]-p2[1]);
    }
    bool isok(vector<int>& p1, vector<int>& p2, vector<int>& p3,vector<int>& p4){
        int x=dis(p1,p2),y=dis(p2,p3),z=dis(p3,p4),w=dis(p4,p1);
        return x==y&&y==z&&z==w&&dis(p1,p3)&&dis(p1,p3)==dis(p2,p4);
    }
    bool validSquare(vector<int>& p1, vector<int>& p2, vector<int>& p3, vector<int>& p4) {
        return isok(p1,p2,p3,p4)||isok(p1,p2,p4,p3)||isok(p1,p3,p2,p4);
    }
};

对角线平分垂直且相等。三种组合法:(p1,p2一对 剩下一对)、(p1,p3一对 剩下一对)、(p1,p4一对 剩下一对)

class Solution {
public:
    const double eps=1e-5,INF=0x3f3f3f3f+0.1;
    bool noequal(vector<int>&p1,vector<int>&p2){
        return !(p1[0]==p2[0]&&p1[1]==p2[1]);
    }
    double getK(vector<int>&p1,vector<int>&p2){
        if(p1[0]==p2[0]) return INF;
        return ((double)p1[1]-p2[1])/(p1[0]-p2[0]);
    }
    int dis(vector<int>&p1,vector<int>&p2){
        return (p1[0]-p2[0])*(p1[0]-p2[0])+(p1[1]-p2[1])*(p1[1]-p2[1]);
    }
    bool chuizhi(double k1,double k2){
        if(fabs(k1-0)<=eps&&fabs(k2-INF)<=eps||fabs(k2-0)<=eps&&fabs(k1-INF)<=eps) return true;
        return fabs(k1*k2-(-1))<=eps;
    }
    bool pingfen(vector<int>& p1, vector<int>& p2, vector<int>& p3,vector<int>& p4){
        int x0=p1[0]+p2[0],y0=p1[1]+p2[1];
        int x1=p3[0]+p4[0],y1=p3[1]+p4[1];
        return x0==x1&&y0==y1;
    }
    bool isok(vector<int>& p1, vector<int>& p2, vector<int>& p3,vector<int>& p4){
        return noequal(p1,p2)&&chuizhi(getK(p1,p2),getK(p3,p4))&&pingfen(p1,p2,p3,p4)&&dis(p1,p2)==dis(p3,p4);
    }
    bool validSquare(vector<int>& p1, vector<int>& p2, vector<int>& p3, vector<int>& p4) {
        return isok(p1,p2,p3,p4)||isok(p1,p3,p2,p4)||isok(p1,p4,p2,p3);
    }
};

223. 矩形面积

题目
在这里插入图片描述

class Solution {
public:
    #define ll long long
    ll get(int x1,int x2,int x3,int x4){
        ll l=max(x1,x3),r=min(x2,x4);
        return (r-l)<0?0:(r-l);//r-l会爆int。。
    }
    int computeArea(int A, int B, int C, int D, int E, int F, int G, int H) {
        return (ll)(C-A)*(D-B)+(ll)(G-E)*(H-F)-(ll)get(A,C,E,G)*get(B,D,F,H);
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值