zoukankan      html  css  js  c++  java
  • 坐标离散化

    #include<iostream>
    #include<math.h>
    #include<algorithm>
    #include<stdio.h>
    #include<vector>
    #include<memory.h>
    #include<queue>
    #define INF 10000000
    
    typedef long long ll;
    using namespace std;
    int W,H,N;
    int X1[505],X2[505],Y1[505],Y2[505];
    //填充用
    bool fld[3005][3005];
    const int dx[4]={0,0,-1,1};
    const int dy[4]={1,-1,0,0};
    //对x1和x2进行坐标离散化,并返回离散化之后的宽度
    int compress(int *x1,int *x2,int w)
    {
        vector<int> xs;
        for(int i=0;i<N;i++)
        {
            for(int d=-1;d<=1;d++)
            {
                int tx1=x1[i]+d,tx2=x2[i]+d;
                if(1<=tx1&&tx1<=w) xs.push_back(tx1);
                if(1<=tx2&&tx2<=w) xs.push_back(tx2);
            }
        }
        sort(xs.begin(),xs.end());
        xs.erase(unique(xs.begin(),xs.end()),xs.end());//删除重复元素
        for(int i=0;i<N;i++)
        {
            x1[i]=find(xs.begin(),xs.end(),x1[i])-xs.begin();
            x2[i]=find(xs.begin(),xs.end(),x2[i])-xs.begin();
        }
        return xs.size();
    }
    int main()
    {
        cin>>W>>H>>N;
        for(int i=0;i<N;i++)
        {
            cin>>X1[i]>>X2[i]>>Y1[i]>>Y2[i];
        }
        //坐标离散化
        W=compress(X1,X2,W);
        H=compress(Y1,Y2,H);
    
        //填充有直线的部分
        memset(fld,0,sizeof(fld));
        for(int i=0;i<N;i++)
        {
            for(int y=Y1[i];y<=Y2[i];y++)
            {
                for(int x=X1[i];x<=X2[i];x++)
                {
                    fld[y][x]=true;
                }
            }
        }
    
        //求区域的个数
        int ans=0;
        for(int y=0;y<H;y++)
        {
            for(int x=0;x<W;x++)
            {
                if(fld[y][x]) continue;
                ans++;
    
                //bfs
                queue<pair<int,int> > que;
                que.push(make_pair(x,y));
                while(!que.empty())
                {
                    int sx=que.front().first,sy=que.front().second;
                    que.pop();
    
                    for(int i=0;i<4;i++)
                    {
                        int tx=sx+dx[i],ty=sy+dy[i];
                        if(tx<0||tx>=W||ty<0||ty>=H) continue;
                        if(fld[ty][tx]) continue;
                        que.push(make_pair(tx,ty));
                        fld[ty][tx]=true;
                    }
                }
            }
        }
        cout<<ans<<endl;
        return 0;
    }
    /*
    10 10 5
    1 6 4 4
    1 10 8 8
    4 4 1 10
    9 9 1 5
    10 10 6 10
    */
    //ans=6
    View Code
  • 相关阅读:
    error: Microsoft Visual C++ 14.0 is required.
    pip安装其他包报错
    MapReduce
    机器学习算法使用
    结巴分词使用实例
    大数据——hbase
    机房收费系统系列一:运行时错误‘-2147217843(80040e4d)’;用户‘sa’登陆失败
    耿建玲视频总结
    学生信息管理系统系列三:验收时的改进
    学生信息管理系统系列二:常见问题
  • 原文地址:https://www.cnblogs.com/wangkaipeng/p/6503322.html
Copyright © 2011-2022 走看看