博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[ACM_暴力][ACM_几何] ZOJ 1426 Counting Rectangles (水平竖直线段组成的矩形个数,暴力)...
阅读量:6281 次
发布时间:2019-06-22

本文共 2628 字,大约阅读时间需要 8 分钟。

Description

We are given a figure consisting of only horizontal and vertical line segments. Our goal is to count the number of all different rectangles formed by these segments. As an example, the number of rectangles in the Figures 1 and 2 are 5 and 0 respectively.

There are many intersection points in the figure. An intersection point is a point shared by at least two segments. The input line segments are such that each intersection point comes from the intersection of exactly one horizontal segment and one vertical segment.

Input

The first line of the file contains a single number M, which is the number of test cases in the file (1 <= M <= 10), and the rest of the file consists of the data of the test cases. Each test case begins with a line containing s (1 <= s <= 100), the number of line segments in the figure. It follows by s lines, each containing x and y coordinates of two end points of a segment respectively. The coordinates are integers in the range of 0 to 1000.

Output

The output for each test case is the number of all different rectangles in the figure described by the test case. The output for each test case must be written on a separate line.

Sample Input

2
6
0 0 0 20
0 10 25 10
20 10 20 20
0 0 10 0
10 0 10 20
0 20 20 20
3
5 0 5 20
15 5 15 25
0 10 25 10

Sample Output

5
0

 

The above input file contains two test cases corresponding to Figures 1 and 2 respectively.

 

题目大意:给一些水平或竖直的线段,求能组成的矩形的个数。

解题思路:因为题目给的只有垂直和水平的线段,且总线段不超过100.所以我们可以暴力。

  1、任选两根水平的线段,若无水平线段可选,结束。否则,转2

  2、从所有的垂直线段里,找到和这两根水平线段相交的线段,假设有tmp条。转3

  3、对于1步选的两条水平线段,因为有tmp跟垂直线段与其相交,根据推算,可以得知,其能组成的矩形就是(tmp - 1)*tmp / 2 个,将其加进总和里即可。转1

 

1 #include
2 #include
3 using namespace std; 4 class Rect{ 5 public: 6 int x1,y1,x2,y2; 7 void set(int a,int b,int c,int d){ 8 x1=a,y1=b,x2=c,y2=d; 9 }10 };//线段类11 bool ok(Rect &a,Rect &b){12 return b.y1<=a.y1 && a.y1<=b.y2 && a.x1<=b.x1 && b.x1<=a.x2;13 }//判断线段相交14 int M;15 int s;16 Rect rectH[1004],rectS[1004];//水平和竖直线段集17 int main(){18 cin>>M;19 while(M--){20 cin>>s;21 int H=0,S=0;22 for(int i=0;i
>x>>y>>x1>>y1;25 if(x==x1){26 if(y>y1)rectS[S++].set(x1,y1,x,y);27 else rectS[S++].set(x,y,x1,y1);28 }else{29 if(x>x1)rectH[H++].set(x1,y1,x,y);30 else rectH[H++].set(x,y,x1,y1);31 }//要注意从上到下,从左到右32 }33 34 int tot=0;35 for(int i=0;i

 

本文转自beautifulzzzz博客园博客,原文链接:http://www.cnblogs.com/zjutlitao/p/3572395.html,如需转载请自行联系原作者

你可能感兴趣的文章
Storm中的Worker
查看>>
dangdang.ddframe.job中页面修改表达式后进行检查
查看>>
Web基础架构:负载均衡和LVS
查看>>
Linux下c/c++相对路径动态库的生成与使用
查看>>
SHELL实现跳板机,只允许用户执行少量允许的命令
查看>>
SpringBoot 整合Redis
查看>>
2014上半年大片早知道
查看>>
Android 6.0指纹识别App开发案例
查看>>
正文提取算法
查看>>
轻松学PHP
查看>>
Linux中的网络监控命令
查看>>
this的用法
查看>>
windows下安装redis
查看>>
CentOS7 yum 安装git
查看>>
启动日志中频繁出现以下信息
查看>>
httpd – 对Apache的DFOREGROUND感到困惑
查看>>
分布式锁的一点理解
查看>>
idea的maven项目,install下载重复下载本地库中已有的jar包,而且下载后jar包都是lastupdated问题...
查看>>
2019测试指南-web应用程序安全测试(二)指纹Web服务器
查看>>
树莓派3链接wifi
查看>>