• hdu 1542 Atlantis(求矩形面积并)


    分别记录x坐标和y坐标,将其分别按照从左到有的方向排序。然后对于一个输入的矩形的x,y坐标范围内的下标进行标记。以两个相邻的坐标为最小单位分割图形,最后求总面积。

    #include<stdio.h>
    #include<string.h>
    #include<stdlib.h>
    #define N 205
    int mark[N][N];
    double a[N],b[N];
    struct node
    {
    	double x1,y1;
    	double x2,y2;
    }s[N];
    int n;
    int cmp(const void *a,const void *b)
    {
    	return *(double *)a-*(double *)b>0?1:-1;
    }
    int Find(double *a,double x)
    {
    	int l,r,mid;
    	l=0;
    	r=2*n-1;
    	while(l<=r)
    	{
    		mid=(l+r)/2;
    		if(a[mid]==x)
    			return mid;
    		else if(a[mid]<x)
    			l=mid+1;
    		else
    			r=mid-1;
    	}
    	return 0;
    }
    int main()
    {
    	int cnt=1;
    	while(scanf("%d",&n),n)
    	{
    		int i,j,k;
    		for(i=0,j=0;i<n;i++)
    		{
    			scanf("%lf%lf%lf%lf",&s[i].x1,&s[i].y1,&s[i].x2,&s[i].y2);
    			a[j]=s[i].x1;
    			b[j]=s[i].y1;
    			j++;
    			a[j]=s[i].x2;
    			b[j]=s[i].y2;	
    			j++;
    		}
    		qsort(a,2*n,sizeof(a[0]),cmp);
    		qsort(b,2*n,sizeof(b[0]),cmp);
    		memset(mark,0,sizeof(mark));
    		double area=0;
    		for(i=0;i<n;i++)
    		{
    			int f1,f2,f3,f4;
    			f1=Find(a,s[i].x1);
    			f2=Find(b,s[i].y1);
    			f3=Find(a,s[i].x2);
    			f4=Find(b,s[i].y2);
    			for(j=f1;j<f3;j++)
    			{
    				for(k=f2;k<f4;k++)
    					mark[j][k]=1;
    			}
    		}
    		for(i=0;i<2*n;i++)
    		{
    			for(j=0;j<2*n;j++)
    				area+=(a[i+1]-a[i])*(b[j+1]-b[j])*(double)mark[i][j];
    		}
    		printf("Test case #%d
    ",cnt++);
    		printf("Total explored area: %.2f
    
    ",area);
    	}
    	return 0;
    }


  • 相关阅读:
    web前端常见面试题
    pyhton课堂随笔-基本画图
    安装和启动json-server
    Idea破解注册码
    MongoDB基本增删改查
    MogonDB安装及配置
    python和jupyter安装
    web中静态资源和动态资源的概念及区别
    nodejs基础(三)
    C#进程、线程、CPU
  • 原文地址:https://www.cnblogs.com/jiangu66/p/3211910.html
Copyright © 2020-2023  润新知