Atlantis--POJ 1151

1、题目类型:计算几何、离散化、扫描法。

2、解题思路:(1)根据输入记录每个矩形的位置,用Coor[i][4] 记录;(2)对已形成的点分别根据横纵坐标进行离散化;(3)扫描获得矩形的总面积。

3、注意事项:注意程序实现过程中,横竖坐标的记录与调用。

4、实现方法:

  
    
#include < iostream >
#include
< algorithm >
using namespace std;

int n,cnt,Ca;
int XY[ 210 ][ 210 ];
double Coor[ 110 ][ 4 ];
double X[ 210 ],Y[ 210 ];

void Init()
{
int i;
cnt
= 0 ;
memset(XY,
0 , sizeof (XY));
for (i = 0 ;i < n;i ++ )
{
cin
>> Coor[i][ 0 ] >> Coor[i][ 1 ] >> Coor[i][ 2 ] >> Coor[i][ 3 ];
X[cnt]
= Coor[i][ 0 ];
Y[cnt]
= Coor[i][ 1 ];
cnt
++ ;
X[cnt]
= Coor[i][ 2 ];
Y[cnt]
= Coor[i][ 3 ];
cnt
++ ;
}
sort(X,X
+ cnt);
sort(Y,Y
+ cnt);
}

void Solve()
{
int i,j,k;
int i1,i2,j1,j2;
for (k = 0 ;k < n;k ++ )
{
for (i1 = 0 ;i1 < cnt;i1 ++ )
{
if (X[i1] == Coor[k][ 0 ])
break ;
}
for (i2 = 0 ;i2 < cnt;i2 ++ )
{
if (X[i2] == Coor[k][ 2 ])
break ;
}
for (j1 = 0 ;j1 < cnt;j1 ++ )
{
if (Y[j1] == Coor[k][ 1 ])
break ;
}
for (j2 = 0 ;j2 < cnt;j2 ++ )
{
if (Y[j2] == Coor[k][ 3 ])
break ;
}
for (i = i1;i < i2;i ++ )
{
for (j = j1;j < j2;j ++ )
{
XY[i][j]
= 1 ;
}
}
}
double Arae = 0.0 ;
for (i = 0 ;i < cnt;i ++ )
{
for (j = 0 ;j < cnt;j ++ )
Arae
+= XY[i][j] * (X[i + 1 ] - X[i]) * (Y[j + 1 ] - Y[j]);
}
printf(
" Test case #%d\n " ,Ca);
printf(
" Total explored area: %.2f\n\n " ,Arae);
}

int main()
{
Ca
= 0 ;
while (cin >> n && n)
{
Init();
Ca
++ ;
Solve();
}
return 0 ;
}

 

你可能感兴趣的:(ant)