欢迎访问 生活随笔!

生活随笔

当前位置: 首页 > 编程资源 > 编程问答 >内容正文

编程问答

nyoj1228矩形判断

发布时间:2025/3/16 编程问答 23 豆豆
生活随笔 收集整理的这篇文章主要介绍了 nyoj1228矩形判断 小编觉得挺不错的,现在分享给大家,帮大家做个参考.

描述

给出平面上4条线段,判断这4条线段是否恰好围成一个面积大于0的矩形。输入
输入第一行是一个整数T(1<=T<=100),代表测试数据的数量。

每组数据包含4行,每行包含4个整数x1, y1, x2, y2 (-100000 <= 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
思路:
我是根据矩形的定义来的(1.矩形定义:有一个直角的平行四边形;2.平行四边形定义:两对边平行的四边形),代码注释中有详解。

AC代码:

#include <stdio.h> #include <algorithm> using namespace std; struct node{int x, y, cnt; }p[8]; int main() {int t, i, j, k;double K[4], max = 1.0/0.0;struct node b[8];scanf("%d", &t);while(t--) {for(i = 0, k = 0; i < 8; i++) {b[i].cnt = 0;scanf("%d%d", &p[i].x, &p[i].y);for(j = 0; j < k; j++) {if(p[i].x == b[j].x && p[i].y == b[j].y) {b[j].cnt++;break;}}if(j == k) {b[k].x = p[i].x;b[k].y = p[i].y;b[k++].cnt++;}if(i%2) K[i/2] = (p[i].y-p[i-1].y+0.0)/(p[i].x-p[i-1].x+0.0);}char fag = 1;if(b[0].cnt!=2||b[1].cnt!=2||b[2].cnt!=2||b[3].cnt!=2) fag = 0;//四条边要构成四边形的话四边形的每个顶点都应该出现两次,否则不是四边形 else {sort(K,K+4);if(K[0] != K[1] || K[2] != K[3]) fag = 0;//判断是否为平行四边形 else {if(K[0]*K[3] != -1) fag = 0;//没有直角则不是矩形 if(K[0]==0&&K[2]==max) fag = 1;//一边斜率为0,一边没有斜率与y轴平行的情况也要考虑 }}if(fag) printf("YES\n");else printf("NO\n");}return 0; }

总结

以上是生活随笔为你收集整理的nyoj1228矩形判断的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。