转载自: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
上代码。
-
-
-
-
-
-
- #include<iostream>
- #include<string.h>
- #include<stdio.h>
- #include <algorithm>
- using namespace std;
- double x[201],y[201],s[101][4];
- int xy[201][201] = {0};
- int n,cas=0;
- double sum1;
- double sum2;
- int main()
- {
- int i,j,k;
- while(cin>>n)
- {
- if(n==0)
- break;
- cas++;
- k=0;
- sum1 = 0.0;
- sum2 = 0.0;
- memset(xy,0,sizeof(xy));
- for(i=1;i<=n;i++)
- {
- cin>>s[i][0]>>s[i][1]>>s[i][2]>>s[i][3];
- x[k]=s[i][0];
- y[k]=s[i][1];
- k++;
- x[k]=s[i][2];
- y[k]=s[i][3];
- k++;
- }
- sort(x,x+2*n);
- sort(y,y+2*n);
- int kk = 0;
- for(k=1;k<=n;k++)
- {
- int i1,i2,j1,j2;
- for(i1=0;i1<2*n;i1++)
- {
- if(x[i1]==s[k][0])
- break;
- }
- for(i2=0;i2<2*n;i2++)
- {
- if(x[i2]==s[k][2])
- break;
- }
- for(j1=0;j1<2*n;j1++)
- {
- if(y[j1]==s[k][1])
- break;
- }
- for(j2=0;j2<2*n;j2++)
- {
- if(y[j2]==s[k][3])
- break;
- }
- for(i=i1;i<i2;i++)
- {
- for(j=j1;j<j2;j++)
- {
- xy[i][j] |= 1<<(k-1);
- }
- }
- kk |= 1<<(k-1);
- }
-
- for(i=0;i<2*n;i++)
- {
- for(j=0;j<2*n;j++)
- {
- sum1 += ((xy[i][j] != 0 ? 1:0)*(x[i+1]-x[i])*(y[j+1]-y[j]));
- sum2 += ((xy[i][j] == kk ? 1:0)*(x[i+1]-x[i])*(y[j+1]-y[j]));
- }
- }
- printf("Test case #%d\n",cas);
- printf("并集面积: %.2f\n",sum1);
- printf("交集面积: %.2f\n",sum2);
- printf("\n");
- }
- return 0;
- }
输出:
Test case #1
并集面积: 180.00
交集面积: 25.00
Test case #2
并集面积: 245.00
交集面积: 6.00
两个输入的情形如图所示:
![](https://img-blog.csdn.net/20131005171532640)