POJ 1151 Atlantis

/*
http://acm.pku.edu.cn/JudgeOnline/problem?id=1151
离散化方法
思想是将整个地图划分为最小的子方格,然后将子方格的面积相加即可得到最终结果

1)首先分别将输入数据的x坐标和y坐标保存到x和y数组里面,然后对这两个数组排序
2)然后遍历所有矩形,对于矩形(x1, y1)(x2, y2), 分别遍历x数组和y数组,对于所有
满足满足x1 <= x[i] <= x2 y1 <= y[j] <= y2的i, j将uniquePoint[i][j]设置为1,
表示这个点属于有效离散点,然后统计所有离散区间面积:
res += uniquePoint[i][j] * (x[i + 1] - x[i]) * (y[i + 1] - y[i])
*/
#include <iostream>
#include <algorithm>
#include <iomanip>
#define MAX_N 100

double x[MAX_N * 2 + 1];
double y[MAX_N * 2 + 1];

double recTangle[MAX_N + 1][4];
int uniquePoint[MAX_N * 2 + 1][MAX_N * 2 + 1];

int recNum;
using namespace std;

int main()
{
    int i, j, caseNum = 0;
    while(cin>>recNum && recNum != 0)
    {
        caseNum++;
        for(i = 0; i < recNum; i++)
        {
            cin>>recTangle[i][0]>>recTangle[i][1]>>recTangle[i][2]>>recTangle[i][3];
            x[i * 2] = recTangle[i][0];
            x[i * 2 + 1] = recTangle[i][2];
            y[i * 2] = recTangle[i][1];
            y[i * 2 + 1] = recTangle[i][3];
        }
        memset(uniquePoint, 0, sizeof(uniquePoint));
        sort(x, x + 2 * recNum);
        sort(y, y + 2 * recNum);
        for(i = 0; i < recNum; i++)
        {
            double x1 = recTangle[i][0], y1 = recTangle[i][1], x2 = recTangle[i][2], y2 = recTangle[i][3];
            int px1, px2, py1, py2;
            for(px1 = 0; px1 < recNum * 2; px1++)
            {
                if(x[px1] == x1)
                    break;
            }
            for(px2 = 0; px2 < recNum * 2; px2++)
            {
                if(x[px2] == x2)
                    break;
            }
            for(py1 = 0; py1 < recNum * 2; py1++)
            {
                if(y[py1] == y1)
                    break;
            }
            for(py2 = 0; py2 < recNum * 2; py2++)
            {
                if(y[py2] == y2)
                    break;
            }
            int p1, p2;
            for(p1 = px1; p1 < px2; p1++)
            {
                for(p2 = py1; p2 < py2; p2++)
                    uniquePoint[p1][p2] = 1;
            }
        }
        double res = 0;
        for(i = 0; i < recNum * 2; i++)
            for(j = 0; j < recNum * 2; j++)
                res += uniquePoint[i][j] * (x[i + 1] - x[i]) * (y[j + 1] - y[j]);
        cout<<"Test case #"<<caseNum<<endl;
        printf("Total explored area: %.2f/n/n", res);
    }
    return 0;
}

 

你可能感兴趣的:(POJ 1151 Atlantis)