• 算法复习之坐标离散化


    离散化概念

    例子:

    1.

    描述: 在桌子上放了N个平行于坐标轴的矩形,这N个矩形可能有互相覆盖的部分,求它们组成的图形的面积。

    输入格式:输入第一行为一个数N(1<=N<=100),表示矩形的数量,下面N行,每行四个整数,分别表示每个矩形的左下角

    和右上角的坐标,坐标范围为-10^8到10^8之间的整数。

    输出格式:

    输出只有一行,一个整数,表示图形面积。

    样例输入:

    3

    1 1 4 3

    2 -1 3 2

    4 0 5 2

    样例输出:

    10

    #include<iostream>
    #include<algorithm>
    using namespace std;
    const int maxn=210;
    int x1[maxn],y1[maxn],x2[maxn],y2[maxn],x[maxn],y[maxn];
    void init() {
        for(int i=0; i<maxn; i++) {
            x1[i]=y1[i]=x2[i]=y2[i]=x[i]=y[i]=0;
        }
    }
    int main() {
        int n;
        while(cin>>n) {
            init();
            for(int i=1; i<=n; i++) {
                cin>>x1[i]>>y1[i]>>x2[i]>>y2[i];
                x[2*i-1]=x1[i];
                x[2*i]=x2[i];
                y[2*i-1]=y1[i];
                y[2*i]=y2[i];
            }
            sort(x+1,x+2*n+1);
            sort(y+1,y+2*n+1);
            int sum=0;
            //枚举每一个单位,,判断是否符合条件
            for(int i=1; i<=2*n-1; i++)
                for(int j=1; j<=2*n-1; j++) {
                    int s=((x[i+1]-x[i])*(y[i+1]-y[i]));
                    for(int k=1; k<=n; k++) {
                        if(x[i]>=x1[k]&&y[i]>=y1[k]&&x[i+1]<=x2[k]&&y[i+1]<=y2[k]) {
                            sum+=s;
                            break;
                        }
                    }
                }
            cout<<sum<<endl;
        }
        return 0;
    }

    2.来自《挑战程序设计竞赛》

    区域的个数

    w*h的各自上画了n条垂直或水平的宽度为1的直线,求出这些线将格子划分成了多少个区域。

    限制条件:1<=w,h<=1000000       1<=n<=500

    利用数组存储搜索即可,问题在于数的范围太大,所以要利用坐标离散化,数组中只需存储有直线的行列,及其前后的行列就够了。

    //离散化函数,对坐标x1,x2进行离散化,并返回离散化之后的宽度
    //其中x1,x2代表一条直线开头与结尾的列 y为行 
    //重新形成一个数组
    #include<iostream>
    #include<algorithm>
    #include<utility>
    #include<vector>
    int Compress(int *x1,int *x2,int w) {
        vector<int> s;//只需存前后及自身坐标
        for(int i=0; i<n; i++) {
            for(int d=-1; d<=1; d++) {
                //首先判断前后
                int tx1=x1[i]+d;
                int tx2=x2[i]+d;
                if(1<=tx1&&tx1<=w)  s.push_back(tx1);
                if(1<=tx2&&te2<=w)  s.push_back(tx2);
                //进行排序删除重复的
            }
        }
        sort(s.begin(),s.end());
        s.erase(unique(s.begin(),s.end()),s.end());
        //重新分配顺序
        for(int i=0; i<n; i++) {
            x1[i]=find(s.begin(),s.end(),x1[i])-s.begin();
            x2[i]=find(s.begin(),s.end(),x2[i])-s.begin();
        }
       return s.size();
    }
  • 相关阅读:
    1057. 数零壹(20)
    Docker镜像操作
    Maven 常用操作
    k8s集群搭建(kubadm方式)
    Spring单事务多线程操作引来的问题(Lock wait timeout exceeded; try restarting transaction)
    Centos7 Maven 安装教程
    Centos7 Git安装教程
    Centos7 Docker安装mysql5.7
    Centos7 Docker安装Nginx教程
    SpringBoot启动及配置文件加载原理分析
  • 原文地址:https://www.cnblogs.com/wtblogwt/p/9750312.html
Copyright © 2020-2023  润新知