POJ 1151 坐标离散化<第一道离散化的水题>

0 <= x1 < x2 <= 100000;0 <= y1 < y2 <= 100000

题意是在坐标上给n个矩阵

问这些矩阵覆盖的面积是多少

如果范围小,我们可以把所有矩阵覆盖的点都标记上1,但是范围非常大,可是给的矩阵数量却不多,那么我们可以考虑离散化。

也就是把输入的200个x和200个y排序后一一对应到map[i][j]中,只考虑这些点。

相当于此时输入的100个框框可以在map1中储存了,只储存每个小!小!小!矩阵的左下角。是因为存完4个点再按4个点来判断可能会错误(想想那是个什么情况)

然后计算面积的时候可以计算这个矩阵的长与宽,每次计算面积不是1,而是一个矩阵的面积。

#include <queue>
#include<iostream>
#include<stdio.h>
#include <string.h>
#include <math.h>
#include <algorithm>
#include <ctime> 
using namespace std;
struct ttt{
	double x1,y1,x2,y2;
};
ttt qq[105];
double x[205],y[205];
int map1[205][205];
int main(){
//	freopen("in.txt","r",stdin);
	//freopen("output.txt","w",stdout);
    int i,j,k,l,f1,f2,f3,t1,t2,t3,m;
    int l1,l2,l3,f4,f5;
    int n,sum1;
    int tt=0;
    while(scanf("%d",&n)==1&&n){
    t1=0;
    tt++;
    for(i=1;i<=n;i++){
		cin >> qq[i].x1 >> qq[i].y1 >> qq[i].x2 >> qq[i].y2;
    	t1++;
		x[t1]=qq[i].x1;
    	y[t1]=qq[i].y1;
    	t1++;
		x[t1]=qq[i].x2;
    	y[t1]=qq[i].y2;
	}
	sort(x+1,x+1+t1);
	sort(y+1,y+1+t1);
	memset(map1,0,sizeof(map1));
	for(i=1;i<=n;i++){
		for(j=1;j<=t1;j++)
			for(k=1;k<=t1;k++){ 
			if(qq[i].x1<=x[j]&&x[j]<qq[i].x2&&qq[i].y1<=y[k]&&y[k]<qq[i].y2){
					map1[j][k]=1;
				}
			}
	}
	double sum2=0;
	double g1;
	for(i=1;i<=t1;i++){
			g1=x[i+1]-x[i];
		for(j=1;j<=t1;j++)
			if(map1[i][j]==1){
				sum2+=g1*(y[j+1]-y[j]);		
			}
		}
		cout << "Test case #" <<tt << endl;
		cout << "Total explored area: ";
		printf("%.2f\n",sum2);
		cout << endl;
		}
  	return 0;
}



.



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值