• UVALive 6663 Count the Regions --离散化+DFS染色


    题意:给你n(n<=50)个矩形(左上角坐标和右下角坐标),问这些矩形总共将平面分成多少个部分。坐标值可能有1e9.

    分析:看到n和坐标的范围,容易想到离散化,当时就没想到离散化以后怎么判断区域个数。后来看别人代码才知道,可以将边界上的点vis赋为1,那么枚举所有哈希后的平面上的点,遇到一个vis=0的点就从这点一直搜过去,搜到边界自动会停止了,因为边界vis=1。所以每次看到一个vis=0的点就ans++,就可以了。真是太弱。。

    代码:

    #include <iostream>
    #include <cstdio>
    #include <cstring>
    #include <cmath>
    #include <algorithm>
    #include <vector>
    #include <map>
    using namespace std;
    #define N 207
    
    vector<int> vx,vy;
    map<int,int> hx,hy;
    int dx[4] = {0,0,1,-1};
    int dy[4] = {1,-1,0,0};
    int vis[N][N];
    int l[55],r[55],t[55],b[55];
    
    bool OK(int nx,int ny)
    {
        if(nx >= 0 && nx <= 201 && ny >= 0 && ny <= 201 && !vis[nx][ny])
            return 1;
        return 0;
    }
    
    void dfs(int x,int y)
    {
        vis[x][y] = 1;
        for(int k=0;k<4;k++)
        {
            int nx = x + dx[k];
            int ny = y + dy[k];
            if(OK(nx,ny))
                dfs(nx,ny);
        }
    }
    
    int main()
    {
        int n,i,j;
        while(scanf("%d",&n)!=EOF && n)
        {
            vx.clear();vy.clear();
            hx.clear();hy.clear();
            for(i=0;i<n;i++)
            {
                scanf("%d%d%d%d",&l[i],&t[i],&r[i],&b[i]);
                vx.push_back(l[i]);
                vx.push_back(r[i]);
                vy.push_back(t[i]);
                vy.push_back(b[i]);
            }
            sort(vx.begin(),vx.end());
            vx.erase(unique(vx.begin(),vx.end()),vx.end());  //运用STL巧妙去重
            sort(vy.begin(),vy.end());
            vy.erase(unique(vy.begin(),vy.end()),vy.end());
            for(i=0;i<vx.size();i++)  //以2为间隔,防止出现面积为1的小矩形计算不到的情况
                hx[vx[i]] = 2*i+1;
            for(i=0;i<vy.size();i++)
                hy[vy[i]] = 2*i+1;
            for(i=0;i<n;i++)  //离散后的值
            {
                l[i] = hx[l[i]];
                t[i] = hy[t[i]];
                r[i] = hx[r[i]];
                b[i] = hy[b[i]];
            }
            memset(vis,0,sizeof(vis));
            for(i=0;i<n;i++)    //边界赋值
            {
                for(j=b[i];j<=t[i];j++)
                {
                    vis[j][l[i]] = 1;
                    vis[j][r[i]] = 1;
                }
                for(j=l[i];j<=r[i];j++)
                {
                    vis[t[i]][j] = 1;
                    vis[b[i]][j] = 1;
                }
            }
            int cnt = 0;
            for(i=0;i<=201;i++)
            {
                for(j=0;j<=201;j++)
                {
                    if(!vis[i][j])
                    {
                        cnt++;
                        dfs(i,j);
                    }
                }
            }
            printf("%d
    ",cnt);
        }
        return 0;
    }
    View Code
  • 相关阅读:
    电商总结(二)日志与监控系统的解决方案
    倾力推荐,哪一本让你想要加入书单
    电商总结(一)小型电商网站的架构
    聊一聊如何提升团队开发效率
    Nancy总结(三)Nancy资料介绍
    【推荐】2016年不得不读的九本好书
    Solr学习总结(七)Solr搜索引擎的整体架构
    再见 2015,你好 2016
    Solr学习总结(六)SolrNet的高级用法(复杂查询,分页,高亮,Facet查询)
    Solr学习总结(五)SolrNet的基本用法及CURD
  • 原文地址:https://www.cnblogs.com/whatbeg/p/3897857.html
Copyright © 2020-2023  润新知