矩形并集交集模板

转载自:http://blog.csdn.net/fall221/article/details/12314489

给出多个坐标表示的矩形,求其并集的面积和交集的面积。答案是离散化!很强。

输入:

2
10 10 20 20
15 15 25 25.5
3
10 10 20 20
15 8 30 15
17 13 25 25
0

上代码。

[cpp]  view plain  copy
  1. //离散化,x,y坐标分别按从小到大排序  
  2. //离散化  
  3. //1、首先分离出所有的横坐标和纵坐标分别按升序存入数组X[ ]和Y[ ]中.  
  4. //2、 设数组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)  
  5. //3、统计面积:area+=XY[i][j] *(X[i]-X[i-1])*(Y[i] – Y[i-1])  
  6.   
  7. #include<iostream>  
  8. #include<string.h>  
  9. #include<stdio.h>  
  10. #include <algorithm>  
  11. using namespace std;  
  12. double x[201],y[201],s[101][4];  
  13. int xy[201][201] = {0};  
  14. int n,cas=0;  
  15. double sum1; // 并集面积  
  16. double sum2; // 交集面积  
  17. int main()  
  18. {  
  19.     int i,j,k;  
  20.     while(cin>>n)  
  21.     {     
  22.         if(n==0)  
  23.             break;  
  24.         cas++;  
  25.         k=0;  
  26.         sum1 = 0.0;  
  27.         sum2 = 0.0;  
  28.         memset(xy,0,sizeof(xy));  
  29.         for(i=1;i<=n;i++)  
  30.         {  
  31.             cin>>s[i][0]>>s[i][1]>>s[i][2]>>s[i][3];  
  32.             x[k]=s[i][0];  
  33.             y[k]=s[i][1];  
  34.             k++;  
  35.             x[k]=s[i][2];  
  36.             y[k]=s[i][3];  
  37.             k++;  
  38.         }  
  39.         sort(x,x+2*n);  
  40.         sort(y,y+2*n);  
  41.         int kk = 0;  
  42.         for(k=1;k<=n;k++)  
  43.         {  
  44.             int i1,i2,j1,j2;  
  45.             for(i1=0;i1<2*n;i1++)  
  46.             {  
  47.                 if(x[i1]==s[k][0])  
  48.                     break;  
  49.             }  
  50.             for(i2=0;i2<2*n;i2++)  
  51.             {  
  52.                 if(x[i2]==s[k][2])  
  53.                     break;  
  54.             }  
  55.             for(j1=0;j1<2*n;j1++)  
  56.             {  
  57.                 if(y[j1]==s[k][1])  
  58.                     break;  
  59.             }  
  60.             for(j2=0;j2<2*n;j2++)  
  61.             {  
  62.                 if(y[j2]==s[k][3])  
  63.                     break;  
  64.             }  
  65.             for(i=i1;i<i2;i++)  
  66.             {  
  67.                 for(j=j1;j<j2;j++)  
  68.                 {  
  69.                     xy[i][j] |= 1<<(k-1);  
  70.                 }  
  71.             }  
  72.             kk |= 1<<(k-1); // 所有bit都置为1  
  73.         }  
  74.           
  75.         for(i=0;i<2*n;i++)  
  76.         {  
  77.             for(j=0;j<2*n;j++)  
  78.             {  
  79.                 sum1 += ((xy[i][j] != 0 ? 1:0)*(x[i+1]-x[i])*(y[j+1]-y[j])); // 只要!=0,说明至少有一个矩形占据过  
  80.                 sum2 += ((xy[i][j] == kk ? 1:0)*(x[i+1]-x[i])*(y[j+1]-y[j])); // 每个矩形都占据过这里  
  81.             }  
  82.         }  
  83.         printf("Test case #%d\n",cas);  
  84.         printf("并集面积: %.2f\n",sum1);  
  85.         printf("交集面积: %.2f\n",sum2);  
  86.         printf("\n");  
  87.     }  
  88.     return 0;  
  89. }  

输出:

Test case #1
并集面积: 180.00
交集面积: 25.00
Test case #2
并集面积: 245.00
交集面积: 6.00

两个输入的情形如图所示:

     

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值