cdoj 93 King's Sanctuary 傻逼几何题

本文介绍了一个简单的算法,用于判断由四个点构成的几何图形是否为正方形、菱形、矩形或平行四边形等。通过计算不同点之间的相对位置和距离来实现这一目的。

King's Sanctuary

Time Limit: 20 Sec  Memory Limit: 256 MB

题目连接

http://acm.uestc.edu.cn/#/problem/show/93

Description


The king found his adherents were building four sanctuaries for him. He is interested about the positions of the sanctuaries and wants to know whether they would form a parallelogram, rectangle, diamond, square or anything else.

Input

The first line of the input is T(1≤T≤1000), which stands for the number of test cases you need to solve. Each case contains four lines, and there are two integers in each line, which shows the position of the four sanctuaries. And it is guaranteed that the positions are given clockwise. And it is always a convex polygon, if you connect the four points clockwise.

Output

For every test case, you should output Case #t: first, where t indicates the case number and counts from 1, then output the type of the quadrilateral.

Sample Input

5
0 0
1 1
2 1
1 0
0 0
0 1
2 1
2 0
0 0
2 1
4 0
2 -1
0 0
0 1
1 1
1 0
0 0
1 1
2 1
3 0

Sample Output

Case #1: Parallelogram
Case #2: Rectangle
Case #3: Diamond
Case #4: Square
Case #5: Others

HINT

题意

 

题解:

给你4个点,让你判断是正方形,还是菱形,还是矩形,还是平行四边形

乱搞就好了 = =

代码:

 

#include <iostream>
#include <queue>
#include <vector>
#include <map>
#include <string>
#include <algorithm>
#include <cstdio>
#include <cstring>
#include <cmath>

using namespace std;

int T, x[4], y[4];

bool Parallelogram()
{
    int a = (y[1] - y[0]) * (x[3] - x[2]);
    int b = (x[1] - x[0]) * (y[3] - y[2]);
    if(a != b) return false;
    a = (x[2] - x[1]) * (y[3] - y[0]);
    b = (x[3] - x[0]) * (y[2] - y[1]);
    return a == b;
}

bool Rectangle()
{
    int a = (x[0] - x[2]) * (x[0] - x[2]) + (y[0] - y[2]) * (y[0] - y[2]);
    int b = (x[1] - x[3]) * (x[1] - x[3]) + (y[1] - y[3]) * (y[1] - y[3]);
    return a == b;
}

bool Diamond()
{
    int a = (y[0] - y[2]) * (y[1] - y[3]);
    int b = (x[1] - x[3]) * (x[0] - x[2]);
    return a == -b;
}

int main()
{
    scanf("%d", &T);
    for(int ca = 1; ca <= T; ca++)
    {
        int i, j;
        for(i = 0; i < 4; i++)
        {
            scanf("%d %d", &x[i], &y[i]);
        }
        printf("Case #%d: ", ca);
        for(i = 0; i < 4; i++)
        {
            for(j = i + 1; j < 4; j++)
            {
                if(x[i] == x[j] && y[i] == y[j])
                    break;
            }
            if(j != 4) break;
        }
        if(i != 4) puts("Others");
        else
        {
            bool tag, tag1;
            tag = Parallelogram();
            if(tag == false) {puts("Others");}
            else
            {
                tag = Rectangle();
                tag1 = Diamond();
                if(tag == false && tag1 == false) puts("Parallelogram");
                else if(tag == true && tag1 == true) puts("Square");
                else if(tag == true) puts("Rectangle");
                else if(tag1 == true) puts("Diamond");
            }
        }
    }
    return 0;
}

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值