【题解UVA11455】Behold my quadrangle

· · 题解

【题解UVA11455】Behold my quadrangle(c++版)

题意简述

给出4条边的长度,判断他们组成图形的形状:正方形、矩形、普通四边形、不能组成四边形

分析

判断正方形和矩形比较简单,判断是4边相等或是2边对应相等即可,关键是如判断能否构成四边形。 我们可以联想到三角形的三边关系

在一个三角形中,任意两边之和大于第三边。

可以推导为

在一个三角形中,两短边之和大于第三边。

为什么这个结论显然成立呢,回想多边形的定义

由在同一平面且不在同一直线上的多条线段首尾顺次连结且不相交所组成的图形叫做多边形

如果两短边之差小于等于第三边,则首位不能顺次连接或在同一直线上

1.两短边之差小于第三边

可想象将2短边“拼”成一条新线段,显然,新线段长度小于第三边,此时我们把他放到第三边的一端,则该线段的另一端一定不在第三遍的另一端。与定义矛盾。

2.两短边之差等于第三边

此时虽然可以放在第三边的两端,但是与第三边重合,与定义矛盾。

证明完毕

同理可将四边形想象为最长边与另外三边拼接,同上,当且仅当三边之和大于最长边时才能组成4边形

分析完毕

优化

为了防止你的代码太繁长,可对4边进行排序,判断时可省去较多步骤这就需要用数组存储。(我用的是sort)

code

#include<bits/stdc++.h>
using namespace std;
int a[5],T;
int main(){
    cin>>T;
    while(T--){
        for(int i=0;i<=3;i++)cin>>a[i];
        sort(a+0,a+4);//STL的排序
        if(a[0]==a[1]&&a[1]==a[2]&&a[2]==a[3]){//正方形
            cout<<"square\n";
        }else if(a[0]==a[1]&&a[2]==a[3]){//只需要判断2个就行了,因为排过序,知道对边
            cout<<"rectangle\n";
        }else if(a[3]<a[0]+a[1]+a[2]){//同上
            cout<<"quadrangle\n";
        }else{
            cout<<"banana\n";
        }
    }

    return 0;
}

我感觉像在写数学题的题解而不是信息

求过qwq