poj 1151

本文介绍了一种计算由多个矩形定义的不规则区域总面积的算法。通过将所有矩形的边界点提取并排序,然后标记每个小矩形单元是否被覆盖,最后累加所有被覆盖单元的面积来得到总面积。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

首先分离出所有的横坐标和纵坐标分别按升序存入数组X[ ]和Y[ ]中.
设数组XY[ ][ ].对于每个矩形(x1,y1)(x2,y2)确定i1,i2,j1,j2,使得,X[i1]>x1,X[i2]<=x2,Y[i1]>y1,Y[i2]>=y2令XY[ i ][ j ] = 1 (i从i1到i2,j从j1到j2)

统计面积:area+=XY[i][j] *(X[i]-X[i-1])*(Y[i] – Y[i-1])

#include<algorithm>
using namespace std;
#define N  100
double a[N][4];
double X[2*N],Y[2*N];
int XY[2*N][2*N];
int main()
{ 
    int n,i,j,k,count,i1,i2,j1,j2,t=1;
    double area;
    while(scanf("%d",&n) && n)
    {
		count=0;
		for(i=0;i<n;i++)
		{
			scanf("%lf%lf%lf%lf",&a[i][0],&a[i][1],&a[i][2],&a[i][3]); 
			X[count]=a[i][0];
			Y[count]=a[i][1];
			count++;
			X[count]=a[i][2];
			Y[count]=a[i][3];
			count++;
		}   
		sort(X,X+2*n);
		sort(Y,Y+2*n);             
		memset(XY,0,sizeof(XY));
		for(k=0;k<n;k++)
		{
			for(i1=0;i1<2*n;i1++)
			{	
				if(X[i1]==a[k][0])
					break;
			}  
			
			for(j1=0;j1<2*n;j1++)
			{
				if(Y[j1]==a[k][1])
					break;
			}
			for(i2=0;i2<2*n;i2++)
			{
				if(X[i2]==a[k][2])
					break;
				}      
			for(j2=0;j2<2*n;j2++)
			{
						if(Y[j2]==a[k][3])
							break;
			}  
					
					for(i=i1;i<i2;i++)
						for(j=j1;j<j2;j++)
							XY[i][j]=1;
		}
		area=0;
		for(i=0;i<2*n;i++)
			for(j=0;j<2*n;j++)
				area+=XY[i][j]*(X[i+1]-X[i])*(Y[j+1]-Y[j]);
			
			printf("Test case #%d\n",t++);
            printf("Total explored area: %.2lf\n\n",area);	
			
    }
    
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值