POJ 1693

题意:就是给你n条直线,求这n条直线最多可以构成多少个矩形。

思路:把直线分类,分成水平的和竖直的,然后两两组合,看是否能构成矩形。枚举

 Memory: 692K		Time: 0MS
Language: G++ Result: Accepted
Source Code
#include <string.h>
#include <stdio.h>
#include <iostream> using namespace std; int sx,sy,ex,ey; struct c{
int sx;
int sy;
int ex;
int ey;
}s[105],h[105]; #define judge(x,y) h[y].sx<=s[x].ex&&h[y].ex>=s[x].ex&&s[x].sy<=h[y].ey&&s[x].ey>=h[y].ey
// 目的是判断这两条直线是否有交点。 int main()
{
int n,m,nums,ans,numh,tmp;
scanf("%d",&n);
while(n--)
{
scanf("%d",&m);
nums=0,numh=0,ans=0;
for(int i=0;i<m;i++)
{
scanf("%d%d%d%d",&sx,&sy,&ex,&ey);
if(sx==ex)
{
if(sy>ey){tmp=sy;sy=ey;ey=tmp;}
s[nums].sx=sx;
s[nums].sy=sy;
s[nums].ex=ex;
s[nums].ey=ey;
nums++;
}
if(sy==ey) //对直线进行分类,且这里要注意,直线的起点的坐标不一定要大于终点的坐标。
{
if(sx>ex){tmp=sx;sx=ex;ex=tmp;}
h[numh].sx=sx;
h[numh].sy=sy;
h[numh].ex=ex;
h[numh].ey=ey;
numh++;
}
}
for(int i=0;i<nums;i++) //每两条直线来比较
for(int j=0;j<numh;j++)
if(judge(i,j))
for(int k=i+1;k<nums;k++)
if(judge(k,j))
for(int l=j+1;l<numh;l++)
if(judge(i,l))
if(judge(k,l))
ans++;
printf("%d\n",ans);
}
return ;
}
上一篇:Java中的公平锁和非公平锁实现详解


下一篇:nullcon HackIM 2016 -- Crypto Question 1