POJ 1151 Atlantis(离散化)

点我看题目

题意 : 就是给你n个矩形的最左下角和最右上角的点的坐标,然后将这n个矩形的面积求出来。

思路 : 离散化求矩形面积并。离散化具体介绍。将横纵坐标离散开来分别存,然后排序,也可以按照黑书上411页写的两个算法中,有一个说是用二分,效率比较好,不过我用的不是二分,而是普通的循环查找。

 1 #include<iostream>
 2 #include <algorithm>
 3 #include <string.h>
 4 #include <stdio.h>
 5 using namespace std;
 6 double x[201],y[201],s[101][4];
 7 int flag[201][201];
 8 int t,cas = 1 ;
 9 double sum;
10 int main()
11 {
12     while(~scanf("%d",&t))
13     {
14         if(t == 0) break;
15         int k = 0 ;
16         sum = 0.0 ;
17         memset(flag,0,sizeof(flag));
18         for(int i = 1 ; i <= n ; i++)
19         {
20             cin>>s[i][0]>>s[i][1]>>s[i][2]>>s[i][3];
21             x[k] = s[i][0];
22             y[k] = s[i][1];
23             k++;
24             x[k] = s[i][2];
25             y[k] = s[i][3];
26             k++;
27         }
28         sort(x,x+2*n);
29         sort(y,y+2*n);
30         for(k = 1 ; k <= n ; k++)
31         {
32             int a,b,c,d;
33             for(a = 0 ; a < 2*n ; a++)
34                 if(x[a] == s[k][0]) break;
35             for(b = 0 ; b < 2*n ; b++)
36                 if(x[b] == s[k][2]) break;
37             for(c = 0 ; c < 2*n ; c++)
38                 if(y[c] == s[k][1]) break;
39             for(d = 0 ; d < 2*n ; d++)
40                 if(y[d] == s[k][3]) break;
41             for(int i = a ; i < b ; i++)
42                 for(int j = c ; j < d ; j++)
43                     flag[i][j] = 1 ;
44         }
45         for(int i = 0 ; i < 2*t ; i++)
46             for(int j = 0 ; j < 2*t ; j++)
47                 if(flag[i][j])
48                     sum+=(x[i+1]-x[i])*(y[j+1]-y[j]);
49         printf("Test case #%d
",cas++);
50         printf("Total explored area: %.2f

",sum);
51     }
52     return 0;
53 }
View Code
原文地址:https://www.cnblogs.com/luyingfeng/p/3626769.html