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

http://hihocoder.com/problemset/problem/1040

首先判断四条线段是否相交,给出八个点,如果有一些点重合,并且不同坐标的点只有4个的话,表示可以构成四边形。

然后判断每一条线段与其他线段树平行或者垂直,每一条线段都和其他线段平行或垂直的话就能构成矩形。

平行或相交可以用斜率计算,注意斜率不存在或者等于0的情况。

平行斜率相等,垂直的话斜率相乘等于-1,或者一个不存在一个为0.

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<cmath>
 5 #include<algorithm>
 6 using namespace std;
 7 double maxn = 1000000;
 8 struct point
 9 {
10     int x,y;
11 }p[10];
12
13 bool check()
14 {
15     int m=8;
16     for(int i=0;i<8;i++)
17         for(int j=i+1;j<8;j++)
18         if(p[i].x==p[j].x&&p[i].y==p[j].y) m--;
19     if(m==4) return true;
20     return false;
21 }
22
23 double solve(point a,point b)
24 {
25     if(a.x==b.x) return maxn;
26     else if(a.y==b.y) return 0;
27     else return 1.0*(a.y-b.y)/(a.x-b.x);
28 }
29 int main()
30 {
31     //freopen("a.txt","r",stdin);
32     int t;
33     double k[5];
34     scanf("%d",&t);
35     while(t--)
36     {
37         for(int i=0;i<8;i++) scanf("%d%d",&p[i].x,&p[i].y);
38         if(check()==0) {printf("NO\n");continue;}  //检测是否构成四边形
39         memset(k,0,sizeof(k));
40         int z=0;
41         for(int i=0;i<7;i+=2)
42         {
43             k[z++]=solve(p[i],p[i+1]); //计算每一条线段的斜率
44            // printf("%.3lf\n",k[z-1]);
45         }
46         bool flag=0;
47         for(int i=0;i<4;i++)
48         {     //判断两条线段的关系
49             for(int j=0;j<4;j++)
50             {
51                 if((k[i]==k[j])||(k[i]==maxn&&k[j]==0)||(k[i]==0&&k[j]==maxn)||(k[i]*k[j]==-1)) continue;
52                 else {flag=1;break;}
53             }
54             if(flag) break;
55         }
56         if(flag) printf("NO\n");
57         else printf("YES\n");
58     }
59     return 0;
60 }
时间: 2024-10-24 02:11:00

hihoCoder 1040 矩形判断(计算几何)的相关文章

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 #1040 (判断是否为矩形)

题目大意:给四条线段,问能否构成一个矩形? 题目分析:先判断能否构成四边形,然后选一条边,看另外三条边中是否为一条与他平行,两条垂直. 代码如下: # include<iostream> # include<cstdio> # include<cmath> # include<set> # include<cstring> # include<algorithm> using namespace std; # define LL lo

hihoCoder 1040 矩阵判断

题目来源:矩阵判断 解题思路: 1.判断矩阵的4个点是否相连,一共输入8个点,只要判断是否4个点是否都经过2遍: 2.判断矩阵中任意一条边与其他边之间要么平行,要么垂直.设A(x1,y1),B(x2,y2),C(x3,y3),D(x4,y4),则线段AB的向量为A’(x2-x1,y2-y1),线段CD的向量C'(x4-x3,y4-y3),另x2-x1=a1,y2-y1=a2,x4-x3=c1,y4-y3=c2,判断A’是否平行C'的方法是a1*c2-a2*c1=0:判断A’是否垂直C'的方法是a

[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,表示输入的

hihocoder 1040(矩形判断)

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

hihocoder 1582 : Territorial Dispute (计算几何)(2017 北京网络赛E)

题目链接 题意:给出n个点.用两种颜色来给每个点染色.问能否存在一种染色方式,使不同颜色的点不能被划分到一条直线的两侧. 题解:求个凸包(其实只考虑四个点就行.但因为有板子,所以感觉这样写更休闲一些.).如果不是所有点都在凸包上,那么把凸包上的点染成颜色1,内部的点染成颜色2:如果是所有点都在凸包上,且点数>3,那么将第一个和第三个点染成颜色1,其余点染成颜色2:否则,不存在满足要求的染色方式. 虽然很弱但是拿到一个一血还是非常开心的~ #include<bits/stdc++.h> u

hihocoder1040 矩形判断

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

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的矩形. 输入 输入