Problem : Counting Rectangles
Description:有一些线段,知道线段的起点和终点,而且这些线段要么是水平的要么是竖直的,求可以形成多少个矩形。
Solution:模拟。先找出两条水平的线段,然后再找出两条竖直的线段,看能否构成矩形。
Code(C++):
#include <iostream>
#include <algorithm>
using namespace std;
struct point
{
int x1;
int y1;
int x2;
int y2;
} p[150],h[150],s[150];
bool cmp1(point a,point b)
{
return a.x1<b.x1;
}
bool cmp2(point a,point b)
{
return a.y1>b.y1;
}
int main()
{
int n,m,i,j,k,t;
int a1,b1,a2,b2;
int count,w,v;
cin>>n;
while(n--)
{
count=0;
w=0;
v=0;
cin>>m;
for(i=0; i<m; i++)
{
cin>>a1>>b1>>a2>>b2;
if(a1==a2)
{
if(b1<b2)
{
p[i].x1=a1;
p[i].y1=b2;
p[i].x2=a2;
p[i].y2=b1;
}
else
{
p[i].x1=a1;
p[i].y1=b1;
p[i].x2=a2;
p[i].y2=b2;
}
}
else if(b1==b2)
{
if(a1<a2)
{
p[i].x1=a1;
p[i].y1=b1;
p[i].x2=a2;
p[i].y2=b2;
}
else
{
p[i].x1=a2;
p[i].y1=b1;
p[i].x2=a1;
p[i].y2=b2;
}
}
}
if(m<4)
{
cout<<"0"<<endl;
continue;
}
for(i=0; i<m; i++)
{
if(p[i].y1==p[i].y2)
{
h[w].x1=p[i].x1;
h[w].y1=p[i].y1;
h[w].x2=p[i].x2;
h[w].y2=p[i].y2;
w+=1;
}
if(p[i].x1==p[i].x2)
{
s[v].x1=p[i].x1;
s[v].y1=p[i].y1;
s[v].x2=p[i].x2;
s[v].y2=p[i].y2;
v+=1;
}
}
sort(h,h+w,cmp2);
sort(s,s+v,cmp1);
for(i=0; i<w; i++)
for(j=i+1; j<w; j++)
for(k=0; k<v; k++)
for(t=k+1; t<v; t++)
if(h[i].x1<=s[k].x1&&h[i].x2>=s[t].x2&&s[k].y1>=h[i].y1&&s[t].y1>=h[i].y2
&&h[j].x1<=s[k].x2&&h[j].x2>=s[t].x2&&s[k].y2<=h[j].y1&&s[t].y2<=h[j].y2)
count++;
cout<<count<<endl;
}
return 0;
}