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

来源:互联网 发布:个人开淘宝食品店 编辑:程序博客网 时间:2024/05/20 22:04

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



.



原创粉丝点击