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\n",cas++);

50         printf("Total explored area: %.2f\n\n",sum);

51     }

52     return 0;

53 }
View Code

 

你可能感兴趣的:(ant)