[hihoCoder]矩形判断

#1040 : 矩形判断

时间限制:1000ms

单点时限:1000ms

内存限制:256MB

描述

给出平面上4条线段,判断这4条线段是否恰好围成一个面积大于0的矩形。

输入

输入第一行是一个整数T(1<=T<=100),代表测试数据的数量。

每组数据包含4行,每行包含4个整数x1, y1, x2, y2 (0 <= x1, y1, x2, y2 <= 100000);其中(x1, y1), (x2,y2)代表一条线段的两个端点。

输出

每组数据输出一行YES或者NO,表示输入的4条线段是否恰好围成矩形。

样例输入
3
0 0 0 1
1 0 1 1
0 1 1 1
1 0 0 0
0 1 2 3
1 0 3 2
3 2 2 3
1 0 0 1
0 1 1 0
1 0 2 0
2 0 1 1
1 1 0 1
样例输出
YES
YES
NO

题目链接:http://hihocoder.com/problemset/problem/1040

解题思路:首先判断四个线段是否可以构成四边形,在判断构成的四边形是不是矩形。即用一个结构体存向量的x,y,只要判断有三个向量有两个相等并且有两个平方和等于另外一个平方就可以判断是矩形了;

AC代码:

#include<stdio.h>
#include<math.h>
struct Point
{
    int x,y;
}p[10];
struct Dis
{
    int xx,yy;
}dis[10];

int judge()
{
    if(abs(dis[0].xx)==abs(dis[1].xx)&&abs(dis[0].yy)==abs(dis[1].yy)&&dis[0].xx*dis[2].xx+dis[0].yy*dis[2].yy==0&&dis[0].xx*dis[3].xx+dis[0].yy*dis[3].yy==0)
        return 1;
    if(abs(dis[0].xx)==abs(dis[2].xx)&&abs(dis[0].yy)==abs(dis[2].yy)&&dis[0].xx*dis[1].xx+dis[0].yy*dis[1].yy==0&&dis[0].xx*dis[3].xx+dis[0].yy*dis[3].yy==0)
        return 1;
    if(abs(dis[0].xx)==abs(dis[3].xx)&&abs(dis[0].yy)==abs(dis[3].yy)&&dis[0].xx*dis[2].xx+dis[0].yy*dis[2].yy==0&&dis[0].xx*dis[1].xx+dis[0].yy*dis[1].yy==0)
        return 1;
    return 0;
}
int main()
{
    int i,j,tcase,len,tt,temp;

    scanf("%d",&tcase);
    while(tcase--)
    {
        temp=1;
        for(i=0;i<8;i++)
            scanf("%d%d",&p[i].x,&p[i].y);
        for(i=0;i<8;i++)
        {
            tt=0;
           for(j=0;j<8;j++)
           {
               if(i==j) continue;
               else if(p[i].x==p[j].x&&p[i].y==p[j].y)
               {
                  tt++;
                  if(tt>=2)
                  {
                      temp=0;break;
                  }
               }
           }
        }
        if(temp)
        {
            dis[0].xx=p[0].x-p[1].x;dis[0].yy=p[0].y-p[1].y;
            dis[1].xx=p[2].x-p[3].x;dis[1].yy=p[2].y-p[3].y;
            dis[2].xx=p[4].x-p[5].x;dis[2].yy=p[4].y-p[5].y;
            dis[3].xx=p[6].x-p[7].x;dis[3].yy=p[6].y-p[7].y;
            if(judge())
                printf("YES\n");
            else
                printf("NO\n");
        }
        else
            printf("NO\n");

    }
    return 0;
}
时间: 2024-10-19 11:32:32

[hihoCoder]矩形判断的相关文章

hihocoder #1040 矩形判断(计算几何问题 给8个点的坐标,能否成为一个矩形 【模板思路】)

#1040 : 矩形判断 时间限制:1000ms 单点时限:1000ms 内存限制:256MB 描述 给出平面上4条线段,判断这4条线段是否恰好围成一个面积大于0的矩形. 输入 输入第一行是一个整数T(1<=T<=100),代表测试数据的数量. 每组数据包含4行,每行包含4个整数x1, y1, x2, y2 (0 <= x1, y1, x2, y2 <= 100000):其中(x1, y1), (x2,y2)代表一条线段的两个端点. 输出 每组数据输出一行YES或者NO,表示输入的

hihoCoder - 1040 - 矩形判断 (简单计算几何~)

#1040 : 矩形判断 时间限制:1000ms 单点时限:1000ms 内存限制:256MB 描述 给出平面上4条线段,判断这4条线段是否恰好围成一个面积大于0的矩形. 输入 输入第一行是一个整数T(1<=T<=100),代表测试数据的数量. 每组数据包含4行,每行包含4个整数x1, y1, x2, y2 (0 <= x1, y1, x2, y2 <= 100000):其中(x1, y1), (x2,y2)代表一条线段的两个端点. 输出 每组数据输出一行YES或者NO,表示输入的

hihocoder 举行判断(计算几何)

判断是否为矩形,必须满足相异的4个点,存在4条边(不重合),边的向量只有两个,且两向量垂直: 满足这些条件就可以了 小知识点: 两个向量垂直(x1,y1),(x2,y2)   x1 * x2 + y1 * y2 == 0; 两个向量平行(x1,y2),(x2,y2)  x1 * y2 - x2 * y2 == 0; #1040 : 矩形判断 时间限制:1000ms 单点时限:1000ms 内存限制:256MB 描述 给出平面上4条线段,判断这4条线段是否恰好围成一个面积大于0的矩形. 输入 输入

hihoCoder 1040 矩形判断(计算几何)

http://hihocoder.com/problemset/problem/1040 首先判断四条线段是否相交,给出八个点,如果有一些点重合,并且不同坐标的点只有4个的话,表示可以构成四边形. 然后判断每一条线段与其他线段树平行或者垂直,每一条线段都和其他线段平行或垂直的话就能构成矩形. 平行或相交可以用斜率计算,注意斜率不存在或者等于0的情况. 平行斜率相等,垂直的话斜率相乘等于-1,或者一个不存在一个为0. 1 #include<iostream> 2 #include<cstd

hihocoder 1040(矩形判断)

题目链接:传送门 题目大意:给你四条线段,判断能否围成一个面积大于0的矩形,能输出YES,不能输出NO 题目思路:    合法的四条线段应该满足 1.应该必须有四个不同的点 2.线段斜率分为两组,组内相同组间不同 3.若有斜率为0或斜率不存在的线段需特判,否则看斜率不同的线段乘积==-1?"YES":"NO" #include <iostream> #include <cstdio> #include <cstdlib> #inc

hihocoder1040 矩形判断

#include <cstdio> #include <iostream> #include <algorithm> #include <queue> #include <cmath> #include <cstring> #include <stack> #include <set> #include <map> #include <vector> using namespace st

[bzoj2517]矩形覆盖

Description 给定一个$l\;\times\;w$的矩形,和$n$个圆,求最小的$k$使得每个圆的半径$\;\times\;k$后,能覆盖整个矩形. Input 第一行一个整数$T$,表示数据组数. 以下$T$组数据,每组数据第一行三个整数$N,L,W$,表示圆个数和矩形大小. 接下来$N$行,每行三个正整数$x[i],y[i],R[i]$表示一个圆心的坐标和原始半径. Output 对于每组数据,输出一个实数$K$,保留$3$位小数. Sample Input 1 1 2 2 1 1

hnu12884 Area Coverage 矩形分割 or 线段树

题意:给你n个二维平面上的矩形,可以两两覆盖,问最后覆盖的总面积为多少 解题思路:1)矩形状分割,可以知道,每多出一个矩形就和前面所有产生的矩形判断,看是有相交,如果有的话,就对前面的矩形进行分割,最多可以分割成8块,因为这个算法是n×n的算法时间复杂度,所以我们还需要在枚举的时候加速,采用引导值(下一个不为0的矩阵的值),最后6700ms过了 解题代码: 1 // File Name: rect1.c 2 // Author: darkdream 3 // Created Time: 2014

POJ 1410 Intersection (线段和矩形相交)

题目: Description You are to write a program that has to decide whether a given line segment intersects a given rectangle. An example: line: start point: (4,9) end point: (11,2) rectangle: left-top: (1,5) right-bottom: (7,1)  Figure 1: Line segment doe