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;
}